java ----- 反射

来源:互联网 发布:如何在淘宝店发通告 编辑:程序博客网 时间:2024/06/08 16:31
v反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
package com.qf.demo;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;public class Test {   public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {try {//得到对象Class class1 = Class.forName("com.qf.demo.Person");//通过对象得到构造方法 构造方法//得到当前类的所有的构造方法Constructor[] constructor = class1.getConstructors();for (Constructor constructor2 : constructor) {System.out.println(constructor2);}//3  通过class得到指定的构造方法//无参数的Constructor constructor2 = class1.getConstructor(null);   //根据无参数的构造方法创建对象Object person = constructor2.newInstance(null);System.out.println(person);//有参数的构造方法Constructor constructor3 = class1.getConstructor(String.class,int.class);Object person2 = constructor3.newInstance("张",23);System.out.println(person2);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

package com.qf.demo;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class Test3 {public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {Class class1 = Class.forName("com.qf.demo.Person");Method[] methods = class1.getMethods();Method[] methods2 = class1.getDeclaredMethods();//for (Method method : methods2) {//System.out.println(method);//}//得到单个的方法  无参数的方法Method method = class1.getMethod("toString",null);Object ss = class1.getConstructor().newInstance(null);method.invoke(ss,null);//有参数的方法Method method2 = class1.getMethod("setName", String.class);Object ss2 = class1.getConstructor().newInstance(null);method2.invoke(ss2, "你好");//有返回值的方法 返回值是通过invoke方法得到的Method method3 = class1.getMethod("getName", null);Object ss3 = class1.getConstructor().newInstance(null);Object object = method3.invoke(ss3, null);System.out.println(object);//调用静态的方法Method method4 = class1.getMethod("getAge", null);Object object2 = method4.invoke(null, null);System.out.println(object2);//调用私有的方法Method method5 = class1.getDeclaredMethod("test", null);Object ss4 = class1.getConstructor().newInstance(null);method5.setAccessible(true);//设置私有方法的可读性    method5.invoke(ss4, null);} }

package com.qf.demo;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;public class Test4 {public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchFieldException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {// 调用属性 也要通过class对象Class class1 = Class.forName("com.qf.demo.Person");// 通过class对象得到属性//得到所有非私有的属性名Field[] fields = class1.getFields();//得到你所有定义的属性名Field[] fields2 = class1.getDeclaredFields();for (Field field : fields2) {System.out.println(field);}//得到指定的属性名Field field = class1.getDeclaredField("name");//设置私有属性可以被读写field.setAccessible(true);Object person = class1.getConstructor(null).newInstance(null);field.set(person,"李四");//给name属性赋值Object object = field.get(person);//得到name属性值System.out.println(object);}}


0 0