你的位置:首页 > 软件开发 > Java > Java的反射机制

Java的反射机制

发布时间:2017-04-06 00:00:59
Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。反射机制的利弊其实好处就是,增加程序的灵活性,避免将程序写死到代码里;但是坏处也有,就是 ...

Java的反射机制

Java反射机制主要提供了以下功能:


但是取得了Method类对象最大的作用不再于方法的列出(方法的列出都在开发工具上使用了),但是对于取得了Method类对象之后还有一个最大的功能,就是可以利用反射调用类中的方法:
·调用方法:public Object invoke(Object obj, Object... args) throws IllegalAccessException,IllegalArgumentException, InvocationTargetException
之前调用类中方法的时候使用的都是“对象.方法”,但是现在有了反射之后,可以直接利用Object类调用指定子类的操作方法。(同时解释一下,为什么setter、getter方法的命名要求如此严格)。
范例:利用反射调用Person类之中的setName()、getName()方法

packagecn.mldn.demo;importjava.lang.reflect.Method;classPerson {  privateString name;  publicvoidsetName(String name) {    this.name= name;  }  publicString getName() {    returnname;  }}publicclassTestDemo {  publicstaticvoidmain(String[] args) throwsException {    Class<?> cls = Class.forName("cn.mldn.demo.Person") ; // 取得Class对象    Object obj = cls.newInstance(); // 实例化对象,没有向Person转型    String attribute = "name"; // 要调用类之中的属性    Method setMet = cls.getMethod("set"+ initcap(attribute), String.class);// setName()    Method getMet = cls.getMethod("get"+ initcap(attribute));// getName()    setMet.invoke(obj, "张三") ; // 等价于:Person对象.setName("张三")    System.out.println(getMet.invoke(obj));// 等价于:Person对象.getName()  }  publicstaticString initcap(String str) {    returnstr.substring(0,1).toUpperCase().concat(str.substring(1)) ;  }}

在日后的所有框架技术开发之中,简单Java类都是如此应用的,所以必须按照标准进行。
3.12.2 .3、调用成员
类之中最后一个组成部分就是成员(Field,也可以称为属性),如果要通过反射取得类的成员可以使用方法如下:
·取得本类的全部成员:public Field[] getDeclaredFields() throws SecurityException;
·取得指定的成员:public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException;
这两个方法的返回值类型是java.lang.reflect.Field类的对象,下面首先观察如何取得一个类之中的全部属性。
范例:取得一个类之中的全部属性

packagecn.mldn.demo;importjava.lang.reflect.Field;classPerson {  privateString name;}publicclassTestDemo {  publicstaticvoidmain(String[] args) throwsException {    Class<?> cls = Class.forName("cn.mldn.demo.Person") ; // 取得Class对象    Field field [] = cls.getDeclaredFields() ; // 取得全部属性    for(intx = 0; x < field.length; x++) {      System.out.println(field[x]);    }  }}

但是找到Field实际上就找到了一个很有意思的操作,在Field类之中提供了两个方法:
·设置属性内容(类似于:对象.属性= 内容):public void set(Object obj, Object value)
throws IllegalArgumentException, IllegalAccessException;
·取得属性内容(类似于:对象.属性):public Object get(Object obj)
throws IllegalArgumentException, IllegalAccessException
可是从类的开发要求而言,一直都强调类之中的属性必须封装,所以现在调用之前要想办法解除封装。
·解除封装:public void setAccessible(boolean flag) throws SecurityException;
范例:利用反射操作类中的属性

packagecn.mldn.demo;importjava.lang.reflect.Field;classPerson {  privateString name;}publicclassTestDemo {public static void main(String[] args) throwsException {    Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象    Object obj = cls.newInstance(); // 对象实例化属性才会分配空间    Field nameField = cls.getDeclaredField("name") ; // 找到name属性    nameField.setAccessible(true) ; // 解除封装了    nameField.set(obj, "张三") ; // Person对象.name = "张三"    System.out.println(nameField.get(obj)); // Person对象.name  }}

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:Java的反射机制

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。