.反射的概念是有Smith在1982年提出来的,主要是指程序可以访问,检测,和修改它本身状态的一种能力
.java反射机制是在运行状态中,对于任意一个类,都能知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个方法,这种动态获取的信息以及动态调用对象的方法的功能称为java语言反射机制。
.通常情况下我们通过new object 来生成一个类的实例,但有时候我们没有办法直接new,只能通过反射动态生成
eg:给一个jar包,在这里里边你知道有一个类,但是不知道怎么实例化,或者没有访问权限。
给一个栗子:
其中类UserInfo中包含了UserName,passwd,UerNo三个属性
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Ref0Test {
public static void main(String[] args) {
try {
Class cls = Class.forName("com.zzxtit.mvc.stu.entity.UserInfo");//获取这个类
//此处就开始通过映射来实例化对象
Object obj = cls.newInstance(); //创建这个类的对象obj以为不知道是什么类型,所以创建为object
Method method = cls.getMethod("toString", null);//获取类中的toString方法
Method method0 = cls.getMethod("setUserName", String.class); //String.class为参数
//Field field = cls.getField("passwd");
//field.set(obj, "1345646784168");
for(Field field : cls.getDeclaredFields()){ // .getfiled获取属性,用循环来遍历所有属性
// System.out.println("--------------------------->" + field);
if("passwd".equals(field.getName())){
field.setAccessible(true); //此处涉及强制修改private属性值;
field.set(obj, "123456");
}
}
//用method.invoke调用方法
method0.invoke(obj, "**");
//调用此方法
System.out.println("=======================>" + method.invoke(obj, null) );
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
实例化无参构造函数的对象,两种方式:
(1)Class.newInstance();
(2) Class.getConstructor(new Class[]{}).newInstance(new Object[]{})
实例化到参构造函数的对象:
class.getConstructor(Class<?>...parameterTypes).newInstance(Object...instargs)
扫描二维码关注公众号,回复:
2706860 查看本文章
.只要用到反射,先获得Class Object
.没有方法能获得当前超类的private方法和属性,你必须通过getSuperclass()找到超类以后再尝试获得
.通常情况下即使是当前类private属性和方法也是不能访问的,你需要设置权限setAccessible(true)来取得private的访问权,但是这已经破坏了面向对象的规则,所以除非万不得已否则尽量少用