1. Java反射机制是什么?
点击查看stackoverflow相关详细问答。
反射是用来描述一种能审查其自身代码并能审查其他代码的一种机制。
2. Reflection相关API
点击这里查看详细PDF介绍。
- java.lang.reflect package
- java.lang.Class
这里主要介绍java.lang.Class
i). Class 实例代表着运行时的类或接口。
ii).每当我们编译一个新的类时,一个Class对象被创建。
iii). 它被保存在以.class为后缀的文件里,和该类名字相同。
iv).运行时,当我们想要创建给定类的对象时,JVM首先检查是否这个类的Class被加载。
v). 如果该类没加载,则类加载器会在文件系统中寻找具有相同名字的类。
方法介绍:
a). this.getClass().getName()
b). static method of Class: Class.forName(String name)
c). getMOdifiers()
d). this.getClass().getDeclaredFields()
e). get(Object o)
f). getName()
package com.fqyuan.thinking;
public final class Sample {
private String fName;
public Sample(String fName) {
super();
this.fName = fName;
}
public String toString() {
StringBuffer result = new StringBuffer();
String newLine = System.getProperty("line.separator");
result.append(this.getClass().getName());
result.append(" Object {");
result.append(newLine);
java.lang.reflect.Field[] fields = this.getClass().getDeclaredFields();
for (int fieldId = 0; fieldId < fields.length; ++fieldId) {
result.append(" ");
try {
result.append(fields[fieldId].getName());
result.append(": ");
// get the String name
// get the value of the field in the “this” object 33
result.append(fields[fieldId].get(this));
} catch (IllegalAccessException ex) {
System.out.println(ex);
}
result.append(newLine);
}
result.append("}");
return result.toString();
}
public static void main(String[] arguments) {
Sample sample = new Sample("Reflection");
System.out.println(sample);
}
}
//Running result:
com.fqyuan.thinking.Sample Object {
fName: Reflection
}
3. Java反射机制Demo
package com.fqyuan.thinking;
import java.lang.reflect.Method;
class Reflected {
private String name;
private int id;
public Reflected(String name, int id) {
this.name = name;
this.id = id;
}
public void foo() {
System.out.println("In Class Reflected.");
}
public void bar(int i) {
id += i;
System.out.println("id is: " + id);
}
public String toString() {
return name + " " + id;
}
}
public class TestReflection {
public static void main(String[] args) throws Exception {
Reflected rObj = new Reflected("Reflected class", 1);
Method method = rObj.getClass().getMethod("foo", null);
//New an instance of a class
rObj.getClass().newInstance();
method.invoke(rObj, null);
Method method1 = rObj.getClass().getMethod("bar", int.class);
method1.invoke(rObj, 5);
}
}
//Running result:
In Class Reflected.
id is: 6
4.总结
- 一般可以通过反射机制得到运行时类名,并创建该类实例。
- 不赞成使用该方法,除非不得已而为之。因为这和java静态语言特性相悖。