这是一个小例子关于如何使用在java中调用反射
通过反射获取一个类的构造方法
public interface Demo {
public static void main(String[] args) throws Exception{
/*
通过反射获取一个类的构造方法:
1.Constructor是构造方法类,任何一个类中的构造方法都可以封装成员一个Constructor的对象
所以可以使用Constructor类的对象调用封装的构造方法来创建类的对象
2.怎么获取一个类的构造方法对应的Constructor对象
Class类中的方法:
- 批量获取构造方法对象:
- public Constructor[] getConstructors():获取所有公有构造方法。
- public Constructor[] getDeclaredConstructors():获取所有的构造方法,包括:公有、受保护、默认、私有。
- 获取单个:
- public Constructor getConstructor(Class… params):获取某个公有构造方法。
Class类型的参数: 传入构造方法参数类型的字节码对象
- public Constructor getDeclaredConstructor(Class … params):*获取某个构造方法,可以是“公有,受保护、默认、私有”
Class类型的参数: 传入构造方法参数类型的字节码对象
3.通过Constructor对象调用构造方法创建对象:
Constructor类中的方法:
newInstance(Object… params):表示执行该Constructor对象表示的构造方法
参数params:传入执行构造方法需要的实参
setAccessible(true): 暴力反射,允许反射
*/
// 获取User类的字节码对象
Class clazz = User.class;
// 获取所有公共的构造方法:
Constructor[] consArr1 = clazz.getConstructors();
System.out.println(consArr1.length);// 2
// 获取所有的构造方法:
Constructor[] consArr2 = clazz.getDeclaredConstructors();
System.out.println(consArr2.length);// 4
// 获取单个公共的构造方法:
Constructor constructor1 = clazz.getConstructor();
Constructor constructor2 = clazz.getConstructor(String.class, int.class);
// 获取单个私有的构造方法:
Constructor constructor3 = clazz.getDeclaredConstructor(int.class);
Constructor constructor4 = clazz.getDeclaredConstructor(String.class);
// 使用constructor1调用newInstance方法
User user1 = (User) constructor1.newInstance();
// 使用constructor2调用newInstance方法
User user2 = (User)constructor2.newInstance("张三",1);
System.out.println(user2.name+"..."+user2.id);
// 使用constructor3调用newInstance方法
constructor3.setAccessible(true);// 暴力反射
User user3 = (User) constructor3.newInstance(2);
System.out.println(user3.id);// 2
}
}
通过反射获取一个类的属性
public interface Demo {
public static void main(String[] args) throws Exception{
/*
通过反射获取一个类的构造方法:
1.Constructor是构造方法类,任何一个类中的构造方法都可以封装成员一个Constructor的对象
所以可以使用Constructor类的对象调用封装的构造方法来创建类的对象
2.怎么获取一个类的构造方法对应的Constructor对象
Class类中的方法:
- 批量获取构造方法对象:
- public Constructor[] getConstructors():获取所有公有构造方法。
- public Constructor[] getDeclaredConstructors():获取所有的构造方法,包括:公有、受保护、默认、私有。
- 获取单个:
- public Constructor getConstructor(Class… params):获取某个公有构造方法。
Class类型的参数: 传入构造方法参数类型的字节码对象
- public Constructor getDeclaredConstructor(Class … params):*获取某个构造方法,可以是“公有,受保护、默认、私有”
Class类型的参数: 传入构造方法参数类型的字节码对象
3.通过Constructor对象调用构造方法创建对象:
Constructor类中的方法:
newInstance(Object… params):表示执行该Constructor对象表示的构造方法
参数params:传入执行构造方法需要的实参
setAccessible(true): 暴力反射,允许反射
*/
// 获取User类的字节码对象
Class clazz = User.class;
// 获取所有公共的构造方法:
Constructor[] consArr1 = clazz.getConstructors();
System.out.println(consArr1.length);// 2
// 获取所有的构造方法:
Constructor[] consArr2 = clazz.getDeclaredConstructors();
System.out.println(consArr2.length);// 4
// 获取单个公共的构造方法:
Constructor constructor1 = clazz.getConstructor();
Constructor constructor2 = clazz.getConstructor(String.class, int.class);
// 获取单个私有的构造方法:
Constructor constructor3 = clazz.getDeclaredConstructor(int.class);
Constructor constructor4 = clazz.getDeclaredConstructor(String.class);
// 使用constructor1调用newInstance方法
User user1 = (User) constructor1.newInstance();
// 使用constructor2调用newInstance方法
User user2 = (User)constructor2.newInstance("张三",1);
System.out.println(user2.name+"..."+user2.id);
// 使用constructor3调用newInstance方法
constructor3.setAccessible(true);// 暴力反射
User user3 = (User) constructor3.newInstance(2);
System.out.println(user3.id);// 2
}
}
通过反射获取一个类的方法
public class Demo {
public static void main(String[] args) throws Exception{
/*
通过反射获取一个类的方法:
1.Method是方法类,类中的每一个方法都是Method的对象,通过Method对象可以调用方法。
2.如何通过反射获取一个类的方法
Class类中的方法:
1. Method[] getMethods() 获取所有的public修饰的成员方法,包括父类中
2. Method[] getDeclaredMethods() 获取当前类中所有的方法,包含私有的,不包括父类中
3. Method getMethod("方法名", 方法的参数类型... 类型) 根据方法名和参数类型获得一个方法对象,只能是获取public修饰的
4. Method getDeclaredMethod("方法名", 方法的参数类型... 类型) 根据方法名和参数类型获得一个方法对象,包括private修饰的
3.通过Method对象调用对应的方法:
Method类中的方法:
1. Object invoke(Object obj, Object... args)
参数1obj:调用成员方法的对象
参数2args:表示调用方法所需要的实参
如果obj=null,则表示该方法是静态方法
2. void setAccessible(true)
暴力反射,设置为可以直接调用私有修饰的成员方法
*/
// 获取Zi类的Class对象
Class clazz = Zi.class;
// 如何通过反射获取一个类的方法:
// 获取多个方法:
// 1.获取所有的public修饰的成员方法,包括父类中
Method[] methodsArr1 = clazz.getMethods();
System.out.println(methodsArr1.length);// 12 因为Object类中有9个public修饰的方法
System.out.println(Fu.class.getMethods().length);// 10 Fu类:1个 Object类:9个
// 2.获取当前类中所有的方法,包含私有的,不包括父类中
Method[] methodsArr2 = clazz.getDeclaredMethods();
System.out.println(methodsArr2.length);// 3
// 获取单个方法
// 1.根据方法名和参数类型获得一个方法对象,只能是获取public修饰的
// 获取test1方法的对象
Method method1 = clazz.getMethod("test1");
System.out.println(method1);
// 获取test2方法的对象
Method method2 = clazz.getMethod("test2", int.class);
System.out.println(method2);
// 2.根据方法名和参数类型获得一个方法对象,包括private修饰的
// 获取test3方法的对象
Method method3 = clazz.getDeclaredMethod("test3");
System.out.println(method3);
System.out.println("=============================");
// 通过Method对象调用对应的方法: 非静态方法
// 调用method1对象表示的test1方法:
Zi zi = new Zi();
method1.invoke(zi);
// 调用method2对象表示的test2方法:
Zi zi2 = new Zi();
method2.invoke(zi2,100);
// 调用method3对象表示的test3方法:
method3.setAccessible(true);
Zi zi3 = new Zi();
method3.invoke(zi3);
System.out.println("=============================");
// 通过Method对象调用对应的方法: 静态方法
Method method4 = clazz.getDeclaredMethod("test4", String.class);
Method method5 = clazz.getDeclaredMethod("test5", String.class);
System.out.println(method4);
System.out.println(method5);
// 调用method4对象表示的test4方法:
method4.invoke(null,"test4方法执行了...");
// 调用method5对象表示的test5方法:
method5.setAccessible(true);
method5.invoke(null,"test5方法执行了...");
}
}