Joyen.fu
日中则昃,月盈则食。

反射的进一步应用

通过反射调用类中的方法

通过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类

 

以下代码只是调用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 }

以上代码可以看出属性也可以在代码中设置访问权限。

posted on 2013-07-25 12:23  Joyen.fu  阅读(158)  评论(0编辑  收藏  举报