Java反射的三种方式
- 创建Class对象的方式一:(对象.getClass()),获取person类中的字节码文件
- 创建Class对象的方式二:(类.class:需要输入一个明确的类,任意一个类型都有一个静态的class属性)
- 创建Class对象的方式三:(forName():传入时只需要以字符串的方式传入即可)
通过Class类的一个forName(String className)静态方法返回一个Class对象,className必须是全路径名称;
1. 创建Person实体类
package com.lwk.domain;
public class Person {
private int age;
private String name;
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
}
2. 创建测试方法PersonTest
package com.lwk.test;
import com.lwk.domain.Person;
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person(20, "小明");
Person p2 = new Person(23, "小红");
// 创建Class对象的方式一:(对象.getClass()),获取person类中的字节码文件
Class class1 = p1.getClass();
System.out.println(p1.getClass().getName());
Class class2 = p2.getClass();
System.out.println(class1 == class2);
System.out.println("==============================");
// 创建Class对象的方式二:(类.class:需要输入一个明确的类,任意一个类型都有一个静态的class属性)
Class class3 = Person.class;
Person per = null;
try {
//newInstance()方法 ---> 获取class类型之后,可以创建该类型的对象
per = (Person) class3.newInstance();
per.setAge(18);
per.setName("周流");
System.out.println(per.toString());
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println(class1 == class3);
System.out.println("==============================");
// 创建Class对象的方式三:(forName():传入时只需要以字符串的方式传入即可)
// 通过Class类的一个forName(String className)静态方法返回一个Class对象,className必须是全路径名称;
// Class.forName()有异常:ClassNotFoundException
Class class4 = null;
try {
class4 = Class.forName("com.lwk.domain.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(class4 == class3);
}
}
注意:在开发中一般使用第三种方法,因为第三种接收的是一个字符串路径,将来可以通过配置文件获取,通用性好;
newInstance()方法 —> 获取class类型之后,可以创建该类型的对象