反射的进一步应用
通过反射调用类中的方法
通过Class类中的getMethod方法取得Method对象:
public Method getMethod(String name,Class<?>... parameterTypes) throws NoSuchMethodException,SecurityException
取得Method对象后,通过以下方法调用:
public Object invoke(Object obj,Object... args) throws IllegalAccessException,IllegalArgumentException,InvocationTargetException
1 package com.fwj.classdemo; 2 3 public class Person implements IStudent{ 4 5 private String name; 6 private int age; 7 8 public Person(String name, int age) { 9 super(); 10 this.name = name; 11 this.age = age; 12 } 13 14 public Person() { 15 super(); 16 } 17 18 public Person(String name) { 19 super(); 20 this.name = name; 21 } 22 23 //省略getter和setter 24 25 @Override 26 public String toString() { 27 return "Person [name=" + name + ", age=" + age + "]"; 28 } 29 30 @Override 31 public String getInfo() { 32 // TODO Auto-generated method stub 33 return AUTHOR + name + age; 34 } 35 36 @Override 37 public void sayHello() { 38 // TODO Auto-generated method stub 39 System.out.println("hello world!!!"); 40 } 41 public String say(String str){ 42 43 return "say()被调用了,参数:"+str; 44 } 45 }
以下代码只是调用Person类中没有参数没有返回值的方法。
1 package com.fwj.classdemo; 2 3 import java.lang.reflect.Method; 4 5 public class PersonClassDemo { 6 7 public static void main(String[] args) throws Exception{ 8 Class<?> c = null; 9 c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象 10 Method m = c.getMethod("sayHello");//参数为方法名 11 m.invoke(c.newInstance()); 12 } 13 }
以下代码调用Person类没有参数有返回值的方法
1 package com.fwj.classdemo; 2 3 import java.lang.reflect.Method; 4 5 public class PersonClassDemo { 6 7 public static void main(String[] args) throws Exception{ 8 Class<?> c = null; 9 c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象 10 Method m = c.getMethod("getInfo");//参数为方法名 11 String str = (String)m.invoke(c.newInstance()); 12 System.out.println(str); 13 } 14 }
以下代码调用Person类中有参数有返回值的方法
1 package com.fwj.classdemo; 2 3 import java.lang.reflect.Method; 4 5 public class PersonClassDemo { 6 7 public static void main(String[] args) throws Exception{ 8 Class<?> c = null; 9 c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象 10 Method m = c.getMethod("say",String.class);//参数为方法名 11 String str = (String)m.invoke(c.newInstance(),"有参数有返回值!!!"); 12 System.out.println(str); 13 } 14 }
通过反射调用类中的getter和setter
1 package com.fwj.classdemo; 2 3 import java.lang.reflect.Method; 4 5 public class PersonClassDemo { 6 7 public static void main(String[] args) throws Exception{ 8 Class<?> c = null; 9 c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象 10 Object obj = c.newInstance(); 11 set("name","fwj",obj,String.class); 12 set("age",23,obj,int.class); 13 get("name",obj); 14 get("age",obj); 15 } 16 /* 17 * 18 * @param name 属性名 19 * @param value 属性值 20 * @param obj 操作的对象 21 * @param type 参数类型/属性类型 22 */ 23 public static void set(String name,Object value,Object obj,Class<?> type)throws Exception{ 24 Method m = obj.getClass().getMethod("set"+initStr(name), type); 25 m.invoke(obj, value); 26 } 27 public static void get(String name, Object obj)throws Exception{ 28 Method m = obj.getClass().getMethod("get"+initStr(name)); 29 Object value = m.invoke(obj); 30 System.out.println(value); 31 } 32 public static String initStr(String name){ 33 StringBuffer buf = new StringBuffer(); 34 buf.append(name.substring(0, 1).toUpperCase()).append(name.substring(1)); 35 return buf.toString(); 36 } 37 }
通过反射操作属性
1 package com.fwj.classdemo; 2 3 import java.lang.reflect.Field; 4 5 public class PersonClassDemo { 6 7 public static void main(String[] args) throws Exception{ 8 Class<?> c = null; 9 c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象 10 Object obj = c.newInstance(); 11 Field field = c.getDeclaredField("name");//获得属性的Field对象 12 field.setAccessible(true);//让私有属性可以访问 13 field.set(obj, "fwj"); 14 System.out.println(field.get(obj)); 15 } 16 }
以上代码可以看出属性也可以在代码中设置访问权限。