java的反射技术(二)

2014-11-24 12:02:26 · 作者: · 浏览: 98
c = clazz.getConstructor(String.class, int.class);
// 利用这个构造函数,构造一个Person对象
Person p = (Person) c.newInstance("hello", 110);
System.out.println(p);
}
// 访问无参构造函数
private static void constructor1() throws Exception {
// 获取Person的字节码对象。
Class clazz = Class.forName("com.java4fun.reflect.Person");
// 获取无参的构造函数对象。
Constructor c = clazz.getConstructor(null);
// 利用这个构造函数,构造一个Person对象
Person p = (Person) c.newInstance(null);
System.out.println(p);
// Class类也提供了一个可直接用无参构造函数构造对象的方法
// Person person = (Person) clazz.newInstance();
// System.out.println(person);
}
}
成员方法的获取:
[java]
import java.lang.reflect.Method;
public class MethodTest {
// 利用反射技术,完成对Person.类的相关操作
public static void main(String[] args) throws Exception {
//method1(); //无参成员方法的获取与使用
// method2(); // 带参数成员方法的获取使用
//method3(); // 私有成员方法的获取使用
method4(); // 参数是数组的方法解决方法
}
// 获取无参成员方法
private static void method1() throws Exception {
// 获取Person的字节码对象。
Class clazz = Class.forName("com.java4fun.reflect.Person");
// 获取无参的方法, 反射Person类的中 public String getName(){}方法
Method m = clazz.getMethod("getName", null);
//运行这个方法,由于方法的运行需要对象,为了方便,在这里直接通过传统的方法创建一个对象。
Person p = new Person("HelloWorld",23);
String name = (String) m.invoke(p, null);
System.out.println(name);
}
// 获取带参数的成员方法
private static void method2() throws Exception {
// 获取Person的字节码对象。
Class clazz = Class.forName("com.java4fun.reflect.Person");
// 获取带参数的方法, 反射Person类的中 public void run(int num){}方法
Method m = clazz.getMethod("run", int.class);
//运行这个方法,由于方法的运行需要对象,为了方便,在这里直接通过传统的方法创建一个对象。
Person p = new Person("HelloWorld",23);
m.invoke(p, 11111);
}
// 获取私有的成员方法
private static void method3() throws Exception {
// 获取Person的字节码对象。
Class clazz = Class.forName("com.java4fun.reflect.Person");
// 获私有的方法, 反射Person类的中 private void secret(String secret){}方法
Method m = clazz.getDeclaredMethod("secret", String.class);
//让私有方法可以访问
m.setAccessible(true);
//运行这个方法,由于方法的运行需要对象,为了方便,在这里直接通过传统的方法创建一个对象。
Person p = new Person("HelloWorld",23);
m.invoke(p, "最近变胖了");
}
// 参数是数组的方法解决方法
private static void method4() throws Exception {
// 获取Person的字节码对象。
Class clazz = Class.forName("com.java4fun.reflect.Person");
// 获静态方法, 反射Person类的中 public static void getFriends(String friends[]){}方法
Method m = clazz.getMethod("getFriends", String[].class);
//这样调用方法会出错,由于版本的遗留问题,new String[]{"java","c","c++"}会被认为是"java" "c" "c++"
//m.invoke(null, new String[]{"java","c","c++"});
//相当于getFriends("java","c","c++");
//正确调用方法,相当于把数组当成一个对象传入
m.invoke(null, (Object)new String[]{"java","c","c++"});
}
}
成员属性的获取:
[java]
import java.lang.reflect.Field;
public class FieldTest {
// 利用反射技术,完成对Person.类的相关操作
public sta