java反射机制
反射机制是Java中类和对象的一个互相映射,主要是通过Class类(字节码类)进行操作,同种类的不同对象都可以像上提出一个相同的Class对象
object中有个class方法
class c=Person.class
//获取class对象
通过类名来获得class对象
Class c1=Class.forName("top.tangcup.Person");
Person p=c1.newInstance();
//通过Class.forName("类全名")函数来获得一个类的class对象
//在通过newInstance()
通过newInstance()方法实例化,但是这种实例化是调用的无参数构造函数。但是有些类是没有或者为私有权限的无惨构造函数。
在不确定一个类可以通过调用getConstructors()和getDeclaredConstructors()方法类获得构造方法信息
class c1=Class.forName("top.tangcup.Person");
Constructor[] cons=c1.getConstructors();//获取构造方法 但仅限获取public权限
Constructor[] cons=c1.getDeclaredConstructors();//获取所有方法 包括私有权限
//通过用获取的构造方法类来进行实例化对象
Person p=cons.newInstance(方法需要的参数);
//如果构造方法为私有权限的方法首先还需要设置允许创建
cons.setAccessible(true);
Person p=cons.newInstance(方法需要的参数);
实例化对象后同样可以用获取构造方法的方式获取函数的其他方法和属性
对象属性的获取和调用,其中通过字节码类获取属性时,是先通过获取属性方法Field对象然后进行操作
Field[] fields=c1.getFields();//获取到类中的public权限的属性
Field[] fields=c1.getDeclaredFields();//获取类中所有权限的属性
//也可以通过属性的名称来获取属性对象
Field field=c1.getField("属性名字");//获取public权限的属性对象
Field field=c1.getDeclaredField("属性名字");//获取所有权限的属性对象
//通过方法属性来使用实例化对象属性
Person p=(Person)c1.newInstance();
Field field=c1.getField("Name");
field.set(p,"Tom");//通过属性对象调用set()方法 set(对象,属性值)
//如果为所有属性要设置使用权限
field.setAccessible(true);
field.set(p,"Tom")
通过字节码对象获取和使用对象的方法
Method[] ms=c1.getMethods()//获取public权限的属性
Method[] ms=c1.getDeclaredMethods()//获取权限权限的属性
//也可以同过方法的名称来获取方法对象,如果方法是带参数的要加入参数类的字节码类
Method ms=c1.getMethod("SetName",String.class)//获取public权限的属性
Method ms=c1.getDeclaredMethod("SetName",String.class)//获取权限权限的属性
//方法的使用是通过方法对象的invoke方法调用
ms.invoke(对象)
在方法对象Method中提供了一下方法来获取更多关于方法信息的方法
String getName()//获取方法名称的方法
int getModifer()//获取方法的修饰符代表的数子配合Modifier类中的toString方法可以名称
String getReturnType().getSimpleName()//获取返回值类型名字
String[] getParameterTypes()//获取参数类型