Java反射的使用步骤

来源:互联网 发布:淘宝新店如何做起来 编辑:程序博客网 时间:2024/06/14 20:17

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。---来自度娘

在java中通过反射获取一个类的field或者method,然后后的结果有如下几部

1、得到这个类的Class对象clz

2、通过clz获取到构造函数

3、通过构造函数的newInstence()方法获取到OBject(类的对象)

4、通过clz的getFiled,getDeclaredField,getMethod,getDeclaredMethod方法获取到对于的Field和Method

5、对获取到的field或者method进行操作,得到结果,这一步需要3中获取到的OBject作为参数


详细说明如下:

为了代码的编写,先写一个Person类,代码如下:

package com.sl.refrect;public class Person{private int age;private String name;public String desc;public Person(){}private Person(int age){this.age = age;}public Person(int age, String name) {super();this.age = age;this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}private void say(){System.out.println("say what");}}


1、得到这个类的Class对象clz,获取clz有三种方式

/** * 1、获取Class---有三种方法 */Class clz=null;//1.1try {clz=Class.forName("com.sl.refrect.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}//1.2 代码安全、效率好(推荐)clz=Person.class;//1.3Person person=new Person();clz=person.getClass();

2、通过clz获取到构造函数

/** * 2、获取构造函数 *///2.1 获取当前类所有的构造器、包括private修饰的构造器 Constructor[] declaredConstructors = clz.getDeclaredConstructors();System.out.println("declaredConstructors");for (Constructor constructor : declaredConstructors) {System.out.println(constructor);}//2.1 获取当前类指定的构造器、包括private修饰的构造器 try {Constructor declaredConstructor = clz.getDeclaredConstructor(int.class);} catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();}//2.3 获取当前类所有的public构造器 Constructor[] constructors = clz.getConstructors();System.out.println("constructors");for (Constructor constructor : constructors) {System.out.println(constructor);}//2.4 获取当前类指定的public构造器try {Constructor constructor = clz.getConstructor(int.class,String.class);} catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();}


3、通过构造函数的newInstence()方法获取到OBject(类的对象)

Constructor constructor = clz.getConstructor();Object obj = constructor.newInstance();
获取到的obj将作为field和method执行相应操作的参数

4、通过clz的getFiled,getDeclaredField,getMethod,getDeclaredMethod方法获取到对于的Field和Method

/** * 3、 * 获取所有的field   * getField(name) getDeclaredField(name)获取对应的field * getFields() getDeclaredFields()获取所有的field * 有Declared为包含private修饰的field */Field[] declaredFields = clz.getDeclaredFields();System.out.println("declaredFields");for (Field field : declaredFields) {System.out.println(field);}Field[] fields = clz.getDeclaredFields();System.out.println("fields");for (Field field : fields) {System.out.println(field);}/** * 4、 * 获取所有的method 和获取field相类似 */Method[] declaredMethods = clz.getDeclaredMethods();System.out.println("declaredMethods");for (Method method : declaredMethods) {System.out.println(method);}Method[] methods = clz.getMethods();System.out.println("methods");for (Method method : methods) {System.out.println(method);}

5、对获取到的field或者method进行操作,得到结果,这一步需要3中获取到的OBject作为参数

/** * 3.2、 * field的使用 */Field field = clz.getDeclaredField("name");field.setAccessible(true);field.set(obj, "my name is sl");
field.setAccessible(true);的作用是因为name的属性是private修饰的,不然会访问不到而会抛异常

/** * 4.4、 * metho 的使用 */Method method = clz.getMethod("setAge", int.class);method.invoke(obj, 12);//Method method2 = clz.getMethod("getName");Method method2 = clz.getMethod("getName", null);String string=(String) method2.invoke(obj, null);System.out.println("name is "+string);Method method3 = clz.getMethod("getAge", null);int age = (int) method3.invoke(obj, null);System.out.println("age is "+age);
7、最后来个结果压压惊

declaredConstructorspublic com.sl.refrect.Person()private com.sl.refrect.Person(int)public com.sl.refrect.Person(int,java.lang.String)constructorspublic com.sl.refrect.Person()public com.sl.refrect.Person(int,java.lang.String)declaredFieldsprivate int com.sl.refrect.Person.ageprivate java.lang.String com.sl.refrect.Person.namepublic java.lang.String com.sl.refrect.Person.descfieldsprivate int com.sl.refrect.Person.ageprivate java.lang.String com.sl.refrect.Person.namepublic java.lang.String com.sl.refrect.Person.descdeclaredMethodspublic void com.sl.refrect.Person.setAge(int)public int com.sl.refrect.Person.getAge()private void com.sl.refrect.Person.say()public java.lang.String com.sl.refrect.Person.getName()public void com.sl.refrect.Person.setName(java.lang.String)methodspublic void com.sl.refrect.Person.setAge(int)public int com.sl.refrect.Person.getAge()public java.lang.String com.sl.refrect.Person.getName()public void com.sl.refrect.Person.setName(java.lang.String)public final native java.lang.Class java.lang.Object.getClass()public native int java.lang.Object.hashCode()public boolean java.lang.Object.equals(java.lang.Object)public java.lang.String java.lang.Object.toString()public final native void java.lang.Object.notify()public final native void java.lang.Object.notifyAll()public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionname is my name is slage is 12

完整的流程代码如下:

package com.sl.refrect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class RefectTest {public static void main(String[] args){/** * 1、获取Class---有三种方法 */Class clz=null;//1.1try {clz=Class.forName("com.sl.refrect.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}//1.2 代码安全、效率好(推荐)clz=Person.class;//1.3Person person=new Person();clz=person.getClass();/** * 2、获取构造函数 *///2.1 获取当前类所有的构造器、包括private修饰的构造器 Constructor[] declaredConstructors = clz.getDeclaredConstructors();System.out.println("declaredConstructors");for (Constructor constructor : declaredConstructors) {System.out.println(constructor);}//2.1 获取当前类指定的构造器、包括private修饰的构造器 try {Constructor declaredConstructor = clz.getDeclaredConstructor(int.class);//注意是int.class而不是Integer.class} catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();}//2.3 获取当前类所有的public构造器 Constructor[] constructors = clz.getConstructors();System.out.println("constructors");for (Constructor constructor : constructors) {System.out.println(constructor);}//2.4 获取当前类指定的public构造器try {Constructor constructor = clz.getConstructor(int.class,String.class);//注意是int.class而不是Integer.class} catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();}try {Constructor constructor = clz.getConstructor();Object obj = constructor.newInstance();/** * 3、 * 获取所有的field   * getField(name) getDeclaredField(name)获取对应的field * getFields() getDeclaredFields()获取所有的field * 有Declared为包含private修饰的field */Field[] declaredFields = clz.getDeclaredFields();System.out.println("declaredFields");for (Field field : declaredFields) {System.out.println(field);}Field[] fields = clz.getDeclaredFields();System.out.println("fields");for (Field field : fields) {System.out.println(field);}/** * 3.2、 * field的使用 */Field field = clz.getDeclaredField("name");field.setAccessible(true);field.set(obj, "my name is sl");/** * 4、 * 获取所有的method 和获取field相类似 */Method[] declaredMethods = clz.getDeclaredMethods();System.out.println("declaredMethods");for (Method method : declaredMethods) {System.out.println(method);}Method[] methods = clz.getMethods();System.out.println("methods");for (Method method : methods) {System.out.println(method);}/** * 4.4、 * metho 的使用 */Method method = clz.getMethod("setAge", int.class);//注意是int.class而不是Integer.classmethod.invoke(obj, 12);//Method method2 = clz.getMethod("getName");Method method2 = clz.getMethod("getName", null);String string=(String) method2.invoke(obj, null);System.out.println("name is "+string);//无参时、上面和下面的效果一样Method method3 = clz.getMethod("getAge");int age = (int) method3.invoke(obj);System.out.println("age is "+age);} catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

--------end---不华丽的结束线----------



0 0
原创粉丝点击