做项目的时候不是很经常用到反射,当用到的时候,一些函数语法可能会忘记,写了个小例子,用的时候可以过来查找。
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
public class HelloWorld{
public static void main(String[] args) throws Exception{
//通过反射实例化对象
// Class<?> cls = HelloWorld.class;
Class<?> cls = Class.forName("HelloWorld");
System.out.println(cls.getName());
Object obj = cls.newInstance() ;
// 取得全部构造函数
Constructor<?> cons [] = cls.getConstructors();
for(int x = 0; x < cons.length; x++) {
System.out.println(cons[x]);
}
// 取得指定构造函数
Constructor<?> con = cls.getConstructor(String.class) ;
if(con != null){
Object objCon = con.newInstance("name");
System.out.println(objCon);
}
// 取得全部方法
Method met [] = cls.getMethods() ;
for(int x = 0; x < met.length; x++) {
System.out.println(met[x]);
}
// 调用类之中的方法
//HelloWorld hw = (HelloWorld)obj;
//hw.sayHello("Chris");
Method sayHelloMethod = cls.getMethod("sayHello", String.class);
sayHelloMethod.invoke(obj, "Chris") ; // 等价于:hw.sayHello("Chris");
// 调用 setName()、getName()方法
String attribute = "Name";
Method setMet = cls.getMethod("set"+ attribute, String.class);// setName()
Method getMet = cls.getMethod("get"+ attribute);// getName()
setMet.invoke(obj, "张三") ; // 等价于:setName("张三")
System.out.println(getMet.invoke(obj));// 等价于:getName()
// 取得全部属性
Field field [] = cls.getDeclaredFields() ;
for(int x = 0; x < field.length; x++) {
System.out.println(field[x]);
}
//利用反射操作类中的属性
Field nameField = cls.getDeclaredField("name") ; // 找到name属性
nameField.setAccessible(true) ; // 解除封装了
nameField.set(obj, "张三") ;
String nameValue = (String)nameField.get(obj);
System.out.println(nameValue);
}
private String name;
public String getName(){
return name;
}
public void setName(String _name){
name = _name;
}
public HelloWorld() {
//
}
public HelloWorld(String _name) {
name = _name;
}
public void sayHello(String words){
if(name != null){
System.out.println(words + name);
}else{
System.out.println(words);
}
}
}