1、Class的实例对象对应各个java类在内存中的字节码。
一个类被类加载器加载到内存中,占用一片空间,这个空间里面的内容就是类的字节码,
不同类的字节码是不同的,所以他们在内存中的内容是不同的,这一个个空间可分别用
一个个的对象来表示,这些对象具有相同的类型,这个类型就是Class
java反射:
1) 反射是Java自我管理(类, 对象)的机制
2) 可以通过反射机制发现对象的类型 发现类型的方法/属性/构造器
3) Java 反射 可以创建对象并访问任意对象方法和属性等
类 Class<T> java.lang.Object java.lang.Class<T>
类型参数:
T - 由此 Class 对象建模的类的类型。例如,String.class 的类型是 Class<String>。
如果将被建模的类未知,则使用 Class<?>。
2、如何得到各个字节码对应的实例对象(Class类型)
1) 类名.class
2 )对象.getClass();
3) Class.forName("类名");
3、九个预定义Class实例对象
boolean、byte、char、short、int、long、float 和 double
和关键字 void 也表示为 Class 对象。
int.class=integer.TYPE
4、反射的步骤
1 )获取类的字节码对应的实例对象
2) 通过类的字节码实例对象的相关方法获得类的成员的字节码实例对象。
3 )通过这些成员的字节码实例对象的各自的方法完成对自己的重新定位。
5、构造方法反射
Constructor类代表某个类中的一个构造方法类型
得到某个类所有的构造方法 Constructor[] getConstructors();
得到某一个构造方法 Constructor getConstructor(Class<?>... parameterTypes);
调用方法时要用获得方法时同样的对象
6、成员变量反射
Field类 代表某个类中成员变量的类型
Field getField(String name) 获取一个公有的成员变量
Field[] getFields() 获取所有公有的成员变量
Field getDeclaredField(String name) 获取一个成员变量,包括私有的
Field[] getDeclaredFields() 获取所有成员变量,包括私有
7、成员方法反射
Method getMethod(String name, Class<?>... parameterTypes) 获取一个公有的方法
Method[] getMethods() 获取所有的公有的方法
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取一个方法,包括私有
Method[] getDeclaredMethods() 获取所有的方法,包括私有
静态方法不需要传对象,对象设为null
8、反射练习
import java.lang.reflect.Constructor;
import cn.Person;
/*
* 通过反射获取构造方法并使用。
*/
public class ReflectDemo {
public static void main(String[] args) throws Exception {
// 获取字节码文件对象
Class c = Class.forName("cn.itcast_01.Person");
// 获取构造方法
// public Constructor[] getConstructors():所有公共构造方法
// public Constructor[] getDeclaredConstructors():所有构造方法
// Constructor[] cons = c.getDeclaredConstructors();
// for (Constructor con : cons) {
// System.out.println(con);
// }
// 获取单个构造方法
// public Constructor<T> getConstructor(Class<?>... parameterTypes)
// 参数表示的是:你要获取的构造方法的构造参数个数及数据类型的class字节码文件对象
Constructor con = c.getConstructor();// 返回的是构造方法对象
// Person p = new Person();
// System.out.println(p);
// public T newInstance(Object... initargs)
// 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
Object obj = con.newInstance();
System.out.println(obj);
// Person p = (Person)obj;
// p.show();
}
}