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