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
(#换成@)。