反射
Class类
l 获取Class对象的三种方式
方式一: 通过Object类中的getObject()方法
Person p = new Person();
Class c = p.getClass();
方式二: 通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单)。
Class c2 = Person.class;
方式三: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可)。
Class c3 = Class.forName("Person");
l 注意:第三种和前两种的区别
前两种你必须明确Person类型.
后面是指定这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了
l 代码演示
/*
* 获取.class字节码文件对象的方式
* 1:通过Object类中的getObject()方法
* 2: 通过 类名.class 获取到字节码文件对象
* 3: 反射中的方法,
* public static Class<?> forName(String className) throws ClassNotFoundException
* 返回与带有给定字符串名的类或接口相关联的 Class 对象
*/
publicclass ReflectDemo {
publicstaticvoid main(String[] args) throws ClassNotFoundException {
// 1: 通过Object类中的getObject()方法
// Person p1 = new Person();
// Class c1 = p1.getClass();
// System.out.println("c1 = "+ c1);
// 2: 通过 类名.class 获取到字节码文件对象
// Class c2 = Person.class;
// System.out.println("c2 = "+ c2);
// 3: 反射中的方法
Classc3 = Class.forName("cn.oracle_01_Reflect.Person");// 包名.类名
System.out.println("c3 = " + c3);
}
}
l Person类
package cn.oracle_01_Reflect;
publicclass Person {
//成员变量
public String name;
publicintage;
private String address;
//构造方法
public Person() {
System.out.println("空参数构造方法");
}
public Person(String name) {
this.name = name;
System.out.println("带有String的构造方法");
}
//私有的构造方法
private Person(String name, intage){
this.name = name;
this.age = age;
System.out.println("带有String,int的构造方法");
}
public Person(String name, intage, String address){
this.name = name;
this.age = age;
this.address = address;
System.out.println("带有String, int, String的构造方法");
}
//成员方法
//没有返回值没有参数的方法
publicvoid method1(){
System.out.println("没有返回值没有参数的方法");
}
//没有返回值,有参数的方法
publicvoid method2(String name){
System.out.println("没有返回值,有参数的方法 name= "+ name);
}
//有返回值,没有参数
publicint method3(){
System.out.println("有返回值,没有参数的方法");
return 123;
}
//有返回值,有参数的方法
public String method4(String name){
System.out.println("有返回值,有参数的方法");
return"哈哈" + name;
}
//私有方法
privatevoid method5(){
System.out.println("私有方法");
}
@Override
public String toString() {
return"Person [name=" + name + ", age=" + age + ", address=" + address+ "]";
}
}
通过反射获取构造方法并使用
publicclass ReflectDemo {
publicstaticvoid main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
//获取Class对象
Class c = Class.forName("cn.oracle_01_Reflect.Person");//包名.类名
//获取所有的构造方法
//Constructor[] cons = c.getConstructors();
Constructor[] cons = c.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
System.out.println("------------------------");
//获取一个构造方法
//public Person()
Constructor con1 = c.getConstructor(null);
System.out.println(con1);
//public Person(String name)
Constructor con2 = c.getConstructor(String.class);
System.out.println(con2);
//private Person(String name, int age)
Constructor con3 = c.getDeclaredConstructor(String.class, int.class);
System.out.println(con3);
//public Person(String name, int age, String address)
Constructor con4 = c.getDeclaredConstructor(String.class, int.class, String.class);
System.out.println(con4);
}
}
通过反射方式,可以获取构造方法,私有构造方法,创建对象
反射机制中,把类中的成员变量使用类Field表示。可通过Class类中提供的方法获取成员变量:
l 返回一个成员变量
n public Field getField(String name) 获取指定的 public修饰的变量
n public Field getDeclaredField(String name) 获取指定的任意变量
l 返回多个成员变量
n public Field[] getFields() 获取所有public 修饰的变量
n public Field[] getDeclaredFields() 获取所有的 变量 (包含私有)
l 获取成员变量的代码演示:
publicclass FieldDemo {
publicstaticvoid main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
//获取Class对象
Class c = Class.forName("cn.oracle_01_Reflect.Person");
//获取成员变量
//多个变量
//Field[] fields = c.getFields();
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("-----------------");
//一个变量
//public int age;
Field ageField = c.getField("age");
System.out.println(ageField);
//private String address
Field addressField = c.getDeclaredField("address");
System.out.println(addressField);
}
}