一.什么是反射
反射机制是在运行状态中,对于任何一个类,都知道它的属性和方法,对于任何一个对象,都知道它的方法和属性
二.反射的好处
1.在运行中判断任意一个对对象所属的类
2.在运行中构造任意一个类的对象
3.在运行中判断任意一个类所具有的成员变量和方法
4.在运行中调用任意一个对象的方法
5.动态代理
三.怎么使用
反射包都在reflect包中
有三种方式获取反射对象
一.获取反射对象
1.Class.forName(全类名)–一般用这个
2.类名.Class
3.对象.getClass()方法
public static void main(String[] args) throws ClassNotFoundException {
//Class.forName(全类名)
Class perClazz=Class.forName("com.crc.test.person");
System.out.println(perClazz);
//类名.Class
Class perClazz1=person.class;
System.out.println(perClazz1);
//对象.getClass()方法
person per=new person();
Class perClazz3=per.getClass();
System.out.println(perClazz3);
}
打印结果
class com.crc.test.person
class com.crc.test.person
class com.crc.test.person
二.获取方法
perClazz.getDeclaredMethods();获取本类所有方法(包括私有)
perClazz.getMethods();获取所有公共方法(1本类,父类,接口。2非私有)
public static void main(String[] args) throws ClassNotFoundException {
//Class入口
Class perClazz=Class.forName("com.crc.test.person");
System.out.println(perClazz);
//获取方法
Method[] method=perClazz.getDeclaredMethods();
for (Method method2 : method) {
System.out.println(method2);
}
}
三.获取接口
perClazz.getInterfaces();
public static void main(String[] args) throws ClassNotFoundException {
//Class入口
Class perClazz=Class.forName("com.crc.test.person");
//获取接口
Class[] method=perClazz.getInterfaces();
for (Class method2 : method) {
System.out.println(method2);
}
}
四.获取父类
perClazz.getSuperclass();
public static void main(String[] args) throws ClassNotFoundException {
//Class入口
Class perClazz=Class.forName("com.crc.test.person");
//获取父类
Class method=perClazz.getSuperclass();
System.out.println(method);
}
五.获取构造方法
perClazz.getConstructors();获取多个
perClazz.getConstructor();获取单个(有参根据传入的是什么类型找对应的构造函数)
public static void main(String[] args) throws ClassNotFoundException {
//Class入口
Class perClazz=Class.forName("com.crc.test.person");
//获取构造方法
Constructor[] method=perClazz.getConstructors();
for (Constructor method2 : method) {
System.out.println(method2);
}
}
Constructor constructor=perClazz.getConstructor(int.class);有参根据传入的是什么类型找对应的构造函数
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
//Class入口
Class perClazz=Class.forName("com.crc.test.person");
Constructor constructor=perClazz.getConstructor(int.class);
//修改private的访问权限
person per =(person) constructor.newInstance(1);
System.out.println(constructor);
}
打印结果
public com.crc.test.person(int)
六.获取所有的属性
perClazz.getDeclaredFields();获取本类所有属性(包括私有)
perClazz.getFields();获取所有公共属性(1本类,父类,接口。2非私有)
public static void main(String[] args) throws ClassNotFoundException {
//Class入口
Class perClazz=Class.forName("com.crc.test.person");
//获取所有公有属性
Field[] file=perClazz.getFields();
for (Field file2 : file) {
System.out.println(file2);
}
}
七.获取当前反射所代表类对象
perClazz.newInstance();
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//Class入口
Class perClazz=Class.forName("com.crc.test.person");
//获取所代表对象
Object Obj=perClazz.newInstance();
person per=(person) Obj;
per.intefaceMethod();
}
八.操作属性
下面这段代码操作age
file.set(per,2);
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
//Class入口
Class perClazz=Class.forName("com.crc.test.person");
//获取所代表对象
Object Obj=perClazz.newInstance();
person per=(person) Obj;
Field file=perClazz.getDeclaredField("age");
//修改private的访问权限
file.setAccessible(true);
file.set(per,2);//类似于setAge(),区别是访问private要加上setAccessible
System.out.println(per.getAge());
}
九.操作方法
method.invoke(per,null);,和操作属性类似
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
//Class入口
Class perClazz=Class.forName("com.crc.test.person");
//获取所代表对象
Object Obj=perClazz.newInstance();
person per=(person) Obj;
Method method=perClazz.getDeclaredMethod("intefaceMethod2");
//修改private的访问权限
method.setAccessible(true);
method.invoke(per,null);
}