反射被视为 动态语言的关键,反射机制允许程序再执行期间借助与ReflectionAPI取 的任何类中的内部信息。并能直接操作任意对象的内部属性和信息。
反射机制的提供的功能
在运行时 判断任意对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任何一个类所拥有的属性和方法。
在运行时调用任何一个类的方法和属性。
生成动态代理(在Android 中的动态加载中使用);
反射相关api(看文档)
public class Person {
//public String nameString;
private String nameString;
public int age;
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show(){
System.out.println("我是 亮亮");
}
public void display(String a){
System.out.println(a);
}
@Override
public String toString() {
// TODO Auto-generated method stub
return getNameString();
}
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class clazz =Person.class; //class 关键字 Class 类 clazz 栈控件引用,纸箱堆空间实体
//1. 创建clazz 对应运行时类对象
//Object instance = clazz.newInstance();//使用泛型 不需要强转, 不使用 是 Object
Person p = (Person) clazz.newInstance();
//通过反射 调用运行时属性 公共 和私有
//Field field = clazz.getField("nameString"); public
Field field = clazz.getDeclaredField("nameString");//private
System.out.println(field);
field.setAccessible(true);
field.set(p, "亮亮");
System.out.println(p+"");
//方法
Method method = clazz.getMethod("show");
method.invoke(p, null);//调用方法 没有形参 或者 invoke(p);
Method m =clazz.getMethod("display",String.class);// 有几个参数写几个
m.invoke(p, "身不由己");
} catch ( Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}