JAVA反射机制实例
下面是Java常见的反射机制的实现。
/**
* 用于反射的类
*/ public class Role { private String name = "默认的不带参数的构造函数"; private String type ="默认是public"; private static Role instance = null; //不带参数的 public Role() { } //带参数的 public Role(String name) { this.name = name; } //私有带参数的构造函数 private Role(String name,String type) { this.name = name; this.type = type; } private void setName(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { System.out.println(getName()+":"+getType()); return this.getName(); } public synchronized static Role getInstance() { if(instance == null) { instance = new Role("带参数的","俺是private"); } return instance; } public String getType() { return type; } private void setType(String type) { this.type = type; } }
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class RefletTest { /** * @param args * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException */ public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { // 反射例子1 System.out.println(); System.out.println("==========反射例子之1=========="); Class<Role> cls1 = Role.class; // 只能反射默认的构造函数 Role role1 = cls1.newInstance(); role1.toString(); // 反射的例子2 System.out.println(); System.out.println("==========反射例子之2=========="); Class<Role> cls2 = (Class<Role>) Class.forName("nc.model.reflect.Role"); // 只能反射默认的构造函数 Role role2 = cls2.newInstance(); role2.toString(); // 反射的例子3 获取类的构造器 /** * public Constructor<?>[] getConstructors() * 返回类中所有的public构造器集合,默认构造器的下标为0 public Constructor<T> * getConstructor(Class<?>... parameterTypes) 返回指定public构造器,参数为构造器参数类型集合 * public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造器,包括私有 * public Constructor<T> getDeclaredConstructor(Class<?>... * parameterTypes) 返回任意指定的构造器 */ System.out.println(); System.out.println("==========反射例子之3=========="); // 先看看public try { Constructor<Role> constructor1 = cls2 .getConstructor(new Class[] { String.class }); Role role3 = constructor1.newInstance("public型的带参数的"); role3.toString(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } System.out.println(); System.out.println("==========反射例子之4=========="); Constructor<Role> constructor2; Role role4 = null; try { constructor2 = cls2.getDeclaredConstructor(new Class[] { //只能使用getDecalredConstructor方法,而不能使用getConstructor String.class, String.class }); constructor2.setAccessible(true);// 设置访问权限,私有时,必须设 role4 = constructor2.newInstance("带参数的", "private型的"); role4.toString(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 反射例子5 获取类的成员变量 /** * 了解了构造器,其实你可以猜到成员变量的获取方法了,成员变量用Field类进行封装。 主要的方法非常的类似: public Field * getDeclaredField(String name) 获取任意指定名字的成员 public Field[] * getDeclaredFields() 获取所有的成员变量 public Field getField(String name) * 获取任意public成员变量 public Field[] getFields() 获取所有的public成员变量 */ try { Field field1 = cls2.getDeclaredField("type");// 参数是字段名 field1.setAccessible(true); Object object1 = field1.get(role2);// 参数是实例化的类 Object object2 = field1.get(role4);// 参数是实例化的类 System.out.println("=========反射例子之5==========="); System.out.println(object1); System.out.println(object2); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 反射例子6 方法 --方法 /** * public Method[] getMethods() 获取所有的公有方法的集合 public Method * getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 * 参数2:参数类型集合 public Method[] getDeclaredMethods() 获取所有的方法 public Method * getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法 * 无参的时候我们只要传null就行了。 */ try { Method method1 = cls2.getDeclaredMethod("setName", new Class[] { String.class }); method1.setAccessible(true); method1.invoke(role2, "私有的我也可以用"); Method method2 = cls2.getMethod("getName", null); Object invoke = method2.invoke(role2, null);//非静态方法第一个参数 不能为空 System.out.println("==========反射例子之6=========="); System.out.println(invoke); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); }// 无参的时候我们只要传null就行了。 catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 反射例子7 方法 --静态方法和字段, Method method3; try { method3 = cls2.getDeclaredMethod("getInstance", null); method3.setAccessible(true); Object invoke = method3.invoke(null, null);//记住与普通方法不同,第一个参数是null(不过貌似不为空,好像也没事) if(invoke instanceof Role) { System.out.println("实例化成功"); } } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } //内部类神马的 ---后续加上 } }