一 .反射
反射的概念
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
Class类
Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short,int, long, float 和 double) 和 void 类型也可表示为 Class 对象。
获取Class对象的三种方法
1.通过对象的getClass()方法
Dog dog = new Dog("wangwang",4,"白色");
Class aClass = dog.getClass();
2.通过类.class属性
Class dogClass = Dog.class;
3.通过Class.forName方法
try {
Class<?> aClass1 = Class.forName("feng.Dog");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
通过反射来实例化对象
1.通过Class对象实例化类对象,调用了默认无参的构造方法
Class<Dog> dogClass = Dog.class;
try {
Dog dog = dogClass.newInstance();
dog.setName("大黄");
System.out.println(dog);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
2.获取所有构造方法
public void test3(){
Class<Dog> dogClass = Dog.class;
Constructor<?>[] constructors = dogClass.getConstructors();
for (int i = 0; i < constructors.length; i++) {
System.out.println(constructors[i].getName());
System.out.println(constructors[i].getParameterCount());
}
try {
//获取一个指定的构造方法
Constructor<Dog> constructor =
dogClass.getConstructor(String.class, int.class,
String.class);
//调用带参数的构造器来实例化对象
Dog dog = constructor.newInstance("小白",20,"红色");
System.out.println(dog);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}