Java reflect的概念?
可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的,所以我们可以通过反射机制直接创建对象。
Java reflect的用途?
Java reflect中个人编码中,有很多人都觉得没什么地方用到。但是在java的很多框架,你如果进入底层查看实现,你就会发现很多地方都用反射,运行时动态的加载需要的对象。
Java reflect的基本应用?(假设存在一个类Person)
利用反射获取class对象
使用Class类的forName方法。
1
Class clss=Class.forName(“com.***.person”);
使用获取某一个对象的Class
1
Class clss=Person.class;
调用某个对象的 getClass() 方法
1
2Person p=new Person();
Class clss=p.getClass();
利用反射来创建对象
利用newInStance()方法调用无参构造创建对象
1
Preson preson=Clss.newInStance()
利用Constructor()方法创建构造器,再调用newInStance()方法
1
2
3Class clzz=String.class;
Constructor constructor=clss.getConstructor(String.Class)
Object s=constructor.newInstance(“2344”);
获取Class对象的方法集合。
getDeclaredMethods 方法返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
1
Method[] declaredFields = clzz.getDeclaredMethods();
getMethods 方法返回某个类的所有公用(public)方法,包括其继承类的公用方
1
Method[] methods = clzz.getMethods();
getMethod 方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象
1
Method method=clzz.getMethod("toLowerCase");
如果要获取私有方法在之前
method.setAccessible(true);
这个属性设置为true.
特别的调用有参构造
1
2
3 Constructor cla = clazz.getDeclaredConstructor(String.class);//获取构造函数的构造器
Object o=cla.newInstance("str");//调用有参构造创建对象
调用方法。
当我们从类中获取了一个方法后,我们就可以用 invoke() 方法来调用这个方法1
2
3public Object invoke(Object obj, Object... args)
throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException