`

JAVA 反射

    博客分类:
  • Java
 
阅读更多

类-对象

对象-类  即为反射

所有的类对象都是Class类的实例。虚拟机在实例化一个类的时候,总要有一个地方存储这个类,这个地方就由Class来管理。

 

通过JAVA的反射机制,我们可以获得一个类的所有属性和方法,并对其进行操作,即使是私有的。

每当一个类被加载,虚拟机就会创建一个Class对象。

 

Class中的常用方法:

 

forName(String className);

这个方法可以得到相应名字的类的Class对象

 

getConstructor(Class<?>...) 返回一个公共的构造方法。

例如: getConstructor() 返回一个无参构造方法

getConstructor(String.class)返回一个参数为String的构造方法

 

getConstructors() 返回所有可以访问到的构造方法

 

getDeclaredConstructor(Class<?>)返回一个私有的构造方法

    getDeclaredConstructor(Class<?>) .setAccessible(true);// 设置可以访问该私有构造方法

getDeclaredConstructors() 返回所有的构造方法包括私有的

 

getField(String name) 返回一个变量名为name的属性

 其余与属性相关的方法和构造方法类似

 

getMethod(String name,Class<?>...pt)返回一个名字为name,参数为Class<E>...的方法。

 其余与属性相关的方法和构造方法类似

 

getName();String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

 

getResource(String name);获得某个资源。

 

newInstance() 创建这个类的对象。

比如Student.class.newInstance();实际就是创建了一个Student对象。

 

举个例子:

先贴出Student的属性和方法:

public class Student {

	String name;
	private String sex;
	int num;

	private Student() {
		System.out.println("默认构造方法");
	}

	public Student(String str) {
		name = str;
	}

	public void study() {
		System.out.println(name + " is studying.");
	}

	public void study(String name) {
		System.out.println(name + " is studying.");
	}

	public String toString() {
		return name + " " + sex + " " + num;
	}
}

 

 

 

执行下面这些语句:
Class c = Student.class;// 通过Student获得其类对象

new Student("").getClass(); // 通过对象获得类对象

c.forName("反射.Student"); // 通过完整类名(包括包)获得其类对象

 

这三个在内存中都是同一片地址,所以是相等的

 

// 获得类的构造方法

Constructor[] cst = c.getConstructors();

 

// 创建一个学生,名字是Bob

Constructor<Student> cs = c.getConstructor(String.class);

Student stu = cs.newInstance("Bob");

 

// 得到私有的默认构造方法,并设为可访问

Constructor css = c.getDeclaredConstructor();

css.setAccessible(true);

 

// 得到私有属性,并赋值

Field fd = c.getDeclaredField("sex");

Student stu1 = new Student("aaa");

fd.setAccessible(true);

fd.set(stu1, "男");

 

// 调用无参数study方法

// 得到方法

Method mt = c.getMethod("study");

// 如何调用mt的方法?,传入需要调用该方法的对象

mt.invoke(stu);

 

// 调用有参数study方法

Method mt2 = c.getMethod("study", String.class);

mt2.invoke(stu, "Lily");

 

Method m = c.getMethod("study", String.class);

Constructor cs = c.getConstructor();

Object obj = cs.newInstance();

m.invoke(obj, "1");

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics