java反射机制学习总结!
正常情况下必须先有类,再有对象,反射是:通过对象,找到其所在的类。 ● 实例化Class的三种方法: 1.getClass() public static void main(String[] args) { Person p = new Person(); Class<?> c = p.getClass();//取得Class对象 System.out.println(c.getName()); } 2.类.Class名称 public static void main(String[] args) { Class<?> c = Person.class;//取得Class对象 System.out.println(c.getName()); } 3.Class.forName() public static void main(String[] args)throws Exception { Class<?> c = null; c = Class.forName("classdemo.instance.Person");//取得Class对象 System.out.println(c.getName()); } ● 通过Class类实例化对象 1、实例化无惨构造的类 正常是通过new关键字进行实例化,现在通过Class完成。 (1).通过包.类名称实例化Class对象 (2).通过Class类中的public T newInstance() public static void main(String[] args)throws Exception { Class<?> c = null; c = Class.forName("classinstance2.Person");//取得Class对象 Person p =(Person) c.newInstance();//实例化Person对象 System.out.println(p); } 2、实例化指定构造的类 如果没有无惨构造,必须通过指定的构造方法,并向其传递制定 的参数才可以进行实例化。 (1).取得一个类的所有构造方法:public Constructor<?>[] getConstructors() (2).通过Construct类的:public T newInstance(Object... initargs) 参数最多的是第一构造,参数最少的是最后一个构造。 public static void main(String[] args)throws Exception{ Class<?> c = null; Person p = null; c = Class.forName("classinstance3.Person");//取得Class对象 Constructor<?>[] con = c.getConstructors();//取得全部构造 p = (Person) con.newInstance("MLKJ",20);//实例化Person对象 System.out.println(p); } ● 通过Clas类取得完整结构 1.取得继承的父类:public Class<? super T> getSuperclass() public static void main(String[] args)throws Exception { Class<?> c = Class.forName("classDemo1.Person"); Class<?> su = c.getSuperclass();//得到继承的父类 System.out.println(su.getName());//输出继承的父类 } 2.取得实现的全部接口:public Class<?>[] getInterfaces() public static void main(String[] args)throws Exception { Class<?> c = Class.forName("classDemo1.Person"); Class<?> inter[] = c.getInterfaces();//得到全部的接口 for (int i = 0; i < inter.length; i++) { System.out.println(inter.getName());//输出实现的接口 } } 接口本身就是一个特殊的类,所以以Class对象数组形式返回 3.取得一个类的全部构造方法:public Constructor<?>[] getConstructors() 然后通过Constructor类中的以下方法进行拼凑: |-取得访问修饰符:public int getModifiers() |-取得参数的全部类型:public Class<?>[] getParameterTypes() 使用Modifer的类进行访问修饰符还原:public static String toString(int mod) public static void main(String[] args)throws Exception { Class<?> c = Class.forName("classDemo1.Person"); Constructor<?> con[] = c.getConstructors();//得到全部构造方法 for (int i = 0; i < con.length; i++) { int mod = con.getModifiers();//得到访问修饰符 String str = Modifier.toString(mod);//还原修饰符 Class<?>[] par = con.getParameterTypes();//得到参数类型 System.out.print(str+" ");//输出访问修饰符 System.out.print(con.getName()+"(");//得到构造方法名称 for (int j = 0; j < par.length; j++) {//遍历参数类型 System.out.print(par.getName()+" arg-"+j);//输出参数类型 if(j<par.length-1){//加,号得算法 System.out.print(","); } } System.out.println(")"); } } 4.得到一个类的全部方法:public Method[] getMethods() 然后通过Method类的以下方法进行拼凑: |-取得方法的返回值类型:public Class<?> getReturnType() |-取得全部参数类型:public Class<?>[] getParameterTypes() |-取得方法的抛出异常:public Class<?>[] getExceptionTypes() public static void main(String[] args) throws Exception { Class<?> c = Class.forName("classDemo1.Person");//实例化Class对象 Method[] me = c.getMethods();//取得全部方法 for (int i = 0; i < me.length; i++) { String str = Modifier.toString(me.getModifiers());// 取得访问权限 Class<?> ret = me.getReturnType();//取得每个方法的返回值类型 String metName = me.getName();//取得方法名称 Class<?>[] par = me.getParameterTypes();//取得参数类型 Class<?>[] ex = me.getExceptionTypes();//取得所有抛出异常 System.out.print(str + " ");//输出访问修饰符 System.out.print(ret + " ");//输出返回值类型 System.out.print(metName + "(");//输出方法名称 for(int j=0;j<par.length;j++){//遍历参数类型 System.out.print(par.getName()+" args-"+j); if(j<par.length-1){ System.out.print(","); } } System.out.print(")"); if(ex.length>0){//如果有异常则打印throws System.out.print("throws "); } for(int j=0;j<ex.length;j++){//然后输出所有异常 System.out.print(ex.getName()); if(j<par.length-1){ System.out.print(","); } } System.out.println(); } } 5.取得一个类的全部属性 |-得到继承而来的公告属性:public Field[] getFields()throws SecurityException |-得到自定义的属性:public Field[] getDeclaredFields()throws SecurityException public static void main(String[] args)throws Exception { Class<?> c = Class.forName("classDemo1.Person"); { Field[] f = c.getFields(); for (int i = 0; i < f.length; i++) { String str = Modifier.toString(f.getModifiers()); System.out.print(str+" "); System.out.println(f.getType().getName()); } } { Field[] f = c.getDeclaredFields(); for (int i = 0; i < f.length; i++) { String str = Modifier.toString(f.getModifiers()); System.out.print(str+" "); System.out.println(f.getType().getName()); } } } ● 反射的进一步应用 1.通过反射调用类中的方法 正常情况下是通过对象.方法(),进行调用,现在通过反射机制完成。 1.Class类中使用public Method getMethod(String name,Class<?>... parameterTypes) 方法取得要调用方法的Method对象。 2.取得Method对象之后,用Method类中的:public Object invoke(Object obj, Object... args) 方法进行调用。 1.调用类中没有参数,没有返回值的方法 public static void main(String[] args)throws Exception { Class<?> c = Class.forName("InvokeMethodDemo.Person");//取得Class实例化对象 Method m = c.getMethod("AA");//取得Method对象 m.invoke(c.newInstance());//调用方法 } 2.调用类中没有参数,有返回值的方法 public static void main(String[] args)throws Exception { Class<?> c = Class.forName("InvokeMethodDemo.Person");//取得Class实例化对象 Method m = c.getMethod("getInfo");//取得Method对象 String str = (String)m.invoke(c.newInstance());//调用方法 System.out.println(str); } 3.调用类中有参数,有返回值的方法 public static void main(String[] args)throws Exception { Class<?> c = Class.forName("InvokeMethodDemo.Person");//取得Class实例化对象 Method m = c.getMethod("say",String.class,String.class);//取得Method对象 String str = (String)m.invoke(c.newInstance(),"AA","love");//调用方法 System.out.println(str); } 4.调用get跟set方法 import java.lang.reflect.Method; public class InvokeGetSet { public static void main(String[] args)throws Exception { Class<?> c = Class.forName("InvokeMethodDemo.Person"); Object o = c.newInstance(); set("name","AA",o,String.class); set("age",30,o,int.class); get("name",o); get("age",o); } /** * @param name 属性名称 * @param value属性值 * @param obj 要操作的对象 */ public static void set(String name,Object value,Object obj,Class<?> type)throws Exception{ Method met = obj.getClass().getMethod("set"+initStr(name), type); met.invoke(obj, value); } public static void get(String name,Object obj)throws Exception{ Method met = obj.getClass().getMethod("get"+initStr(name)); Object value = met.invoke(obj); System.out.println(value); } public static String initStr(String name){ StringBuffer sb = new StringBuffer(); sb.append(name.substring(0, 1).toUpperCase()).append(name.substring(1)); return sb.toString(); } }
页:
[1]