----------------------ASP.Net+Android+IOS开发----------------------期待与您交流!
反射
反射:reflect
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也是用一个个Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应的实例对象来表示,他们是Field、Method、Contructor、Package、等。
反射:程序的运行时期,对一个类的字节码文件(class)进行解剖,解剖后,看到字节码文件中定义的内容、成员方法、成员变量、构造方法可以运行这个方法,成员变量。、
简单来说:编译时期不知道运行谁,运行时期也不知道运行谁,运行的类和方法,由用户指定。
反射相关的东西—类
Java是面向对象的语言,class文件也是对象,有一个类,描述这个class文件的,java.lang.Class。
构造方法也是一个对象,Constructor类。
成员方法也是一个对象,Method类。
成员变量也是一个对象,Filed类。
获取到一个类的字节码文件对象
getClass()
类名.class
Class.forName()
获取字节码文件中的构造方法,并运行
getConstructor(参数)获取构造方法。
getConstructors()获取所有public的构造方法,存储数组。
getDeclaredConstructor(参数)获取所有的构造方法,非public。
Constructor类的 newInstance()运行获取到的构造方法。
获取成员方法并运行
getMethods()获取成员方法,存储数组。
getMethod(方法名,参数列表)。
getDeclaredMethod(方法名,参数列表)。
Method类的 invoke(对象,方法的参数)。
实例:
public class Person {
public Person(int x) {
}
public Person(String s) {
this.name = s;
}
private Person() {
}
public String name;
private int age;
public void show() {
System.out.println(name + ":::show:::" + age);
}
public void show(int x) {
System.out.println(name + ":::show:::" + age + x);
}
private void method() {
System.out.println("private method");
}
public String toString() {
return "Person...toString" + name;
}
}
获取字节码文件对象:
/*
* 获取字节码文件对象
*/
public class ReflectDemo1 {
public static void main(String[] args) throws Exception {
method();
}
// 获取字节码文件对象
private static void method() throws Exception {
// 第一种方式,通过对象获取,对象的getClass方法
// Person p = new Person();
// public final Class<?> getClass() Person.class字节码文件对象
// Class c = p.getClass();
// System.out.println(c);
// 第二种方法,通过Person类直接获取,任意的数据类型,都有一个静态属性class返回字节码文件对象
Class c1 = Person.class;
// System.out.println(c==c1);//T
// System.out.println(c.equals(c1));//T
// 第三种方法,使用Class类中的静态方法 forName(String 类名)
Class c2 = Class.forName("cn.itcast.reflect.Person");
System.out.println(c2);
System.out.println(c1 == c2);
}
}
获得构造方法,运行
import java.lang.reflect.*;
/*
* 获得构造方法,运行
*/
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
method();
}
private static void method() throws Exception {
// 获得字节码文件对象
Class clazz = Class.forName("cn.itcast.reflect.Person");
// public Constructor<?>[] getConstructors() 获取构造方法,存储成数组,构造方法public权限
Constructor[] con = clazz.getConstructors();
for (Constructor c : con) {
System.out.println(c);
}
// Constructor<T> getConstructor(Class<?>... parameterTypes)
// 带有一个String类型参数的构造方法
Constructor c = clazz.getConstructor(String.class);
// 运行构造方法 public T newInstance(Object... initargs)
Object obj = c.newInstance("我是谁");
System.out.println(obj);
// 获取私有构造方法并运行
Constructor con1 = clazz.getDeclaredConstructor();
System.out.println("----" + con1);
con1.setAccessible(true);// 暴力访问
Object obj1 = con1.newInstance();
System.out.println(obj1);
}
}
获取成员方法并运行
/*
* 获取成员方法并运行
*/
import java.lang.reflect.*;
public class ReflectDemo3 {
public static void main(String[] args) throws Exception {
method();
}
private static void method() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
// public Method[] getMethods()
Method[] m = clazz.getMethods();
for (Method mm : m) {
System.out.println(mm);
}
// public Method getMethod(String name,Class<?>... parameterTypes)
Method m1 = clazz.getMethod("show", int.class);
System.out.println("m1===" + m1);
// Object invoke(Object obj, Object... args)
Constructor con = clazz.getConstructor(String.class);
Object obj = con.newInstance("你是谁呀");
m1.invoke(obj, 45);
Method m2 = clazz.getDeclaredMethod("method");
m2.setAccessible(true);
m2.invoke(obj);
}
}
获取成员变量并运行
/*
* 获取成员变量并运行
*/
import java.lang.reflect.*;
public class ReflectDemo4 {
public static void main(String[] args) throws Exception {
method();
}
private static void method() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Field[] f = clazz.getFields();
for (Field ff : f) {
System.out.println(ff);
}
// 单独获取一个成员变量
Field fd = clazz.getField("name");
// void set(Object obj, Object value)
Constructor con = clazz.getConstructor(String.class);
Object obj = con.newInstance("QQQQQQQ");
fd.set(obj, "WWWWWWWWw");
System.out.println(obj);
}
}
----------------------ASP.Net+Android+IOS开发----------------------期待与您交流!
详情请查看:http://edu.csdn.net