java反射05-Constructor对象
前言Constructor 对象,就是字面意思,就是一个构造器对象。可以通过它构建对象。
有构造器就能创建对象。构造器对象,用来获取当前反射类的构造器。
主要方法:
getDeclaredConstructor:根据方法签名,获取构造器,可返回 private public 等。
getConstructor: 只能返回 public 的构造器
反射获得 Constractor这里是创建一个对象,不包括调用。
1234567public void test() { Class cls = Class.forName("com.liukai.Person"); //获取指定的对象(公共的) Constructor constructor = cls.getConstructor(); // 创建一个对象 Object p = constructor.newInstance();}
再举个例子,通过getDeclaredConstructor获取指定方法签名的构造器。方法:Constructor.getDeclaredConstruc ...
java反射04-获取方法调用栈
前言实际开发中,有多个接个有多个实现类时,搞不清调用栈,可以用这个方法来查看。
实现实现方式,通过拿到当前线程的所有调用栈信息,再遍历输出即可,虽然简单吧,但是实用呀,有时候一个方法报错了,没有异常调用栈,就比较难受了,加上这个方法,自己打调用栈。
获取方法调用栈方式:
1Thread.currentThread().getStackTrace();
代码比较简单,如下:
12345678910111213141516171819202122232425262728293031323334public class Test { public static void main(String[] args) { //打印所有调用栈 testInvoke(); } public static void testInvoke() { defaultTag(); } private static String defaultTag() { StackTraceElement[] stackTrace ...
java-解决jar包反射获取不到类
前言在开发一个基础工具包给业务组的小伙伴们使用的时候,发现一个小问题,就是在反射的时候在自己电脑上运行的正常,但是打成jar包后,就class not fuond,有点奇怪。如果能借助Spring这个都不是事,关键是不能用。
场景复现下面的目的是,找到这个指定包下的所有类,对我指定了注解的类进行加载,其实就是一个可以灵活装配、拆卸的策略模式。这样业务的类可以通过指定注解来选择是否成为业务的一部分。下面这段代码在IDE中运行正常。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293import java.io.File;import java.io.IOException;import java.io.InputStream;import java.net.JarURLConnection ...
java反射03-查看方法修饰符
修饰符通过反射可以获取类的修饰符,主要方法: Class.getModifiers() 返回一个用于描述Field、Method和Constructor的修饰符的整形数值,该数值代表的含义可通过Modifier这个类分析。Modifier 类它提供了有关Field、Method和Constructor等的访问修饰符的信息,主要的方法有:toString(int modifiers);返回: 整形数值modifiers代表的修饰符的字符串;
查看类修饰符使用 String.class 来验证一下:
123456789101112131415161718import java.lang.reflect.Modifier;/** * 获取类的修改符 * * @author liu kai * @since 2015-11-23 14:48 */public class ModifierTest { public static void main(String[] args) { Class cl = String.class; Strin ...
java反射02-使用Class对象
简述使用反射万事第一步,获取 Class 类。获取Class对象的方式:
Class.forName()
Class.class
Class.getClass()
获取Class对象如何取得操作类的Class对象,常用的有三种方式:使用Class的静态方法来获取一个要被反射的对象。
1.调用Class.forName();
123public void test() { Class cls = Class.forName("com.test.Person");}
2.使用类的.class字节文件
123public void test() { Class<?> cls = String.class}
3.调用对象的getClass方法
1234public void test() { String str = "abc"; Class<?> cls = str.getClass();}
验证相同类型class是一个对象代码验证不同 class 获 ...
java反射01-简述
简述理解意义:反射的意义是在于改变程序运行时的状态。比如我在程序没运行之前,我不知道我需要什么对象,但是我想在程序运行的过程中去动态的说我想要什么东西,这时可以通过反射去实现。通过反射可以调用运行时类的指定方法和属性。任何一个类对反射来说结构都是暴露的。java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
反射需要四个类实现一些常用的功能:
Class
Field
Medthod
Constrator
使用反射机制要遵循以下三步:
获取要操作的类的Class对象
通过拿到这个Class对象,就可以拿到类的属性和方法
可以通过上面拿到的属性和方法去操作属性和方法
反射有什么用通过反射API可以获取任何,是任何在运行时的对象和属性。
反射的功能:
构建对象
在运行时操作对象属性、方法、构造器
生成动态代理
Class 对象使用反射第一步,获取Class对象。拿到Class对象才能接着往下操作。Java 类在运行的时候,某个类 ...