回忆(一):反射中获得class对象的三种方法

时间:2023-03-09 17:44:24
回忆(一):反射中获得class对象的三种方法
package reflex;

/*
* 反射:就是通过class文件对象 去使用该文件中的成员
* 变量,构造方法,成员方法。
*
* Person p = new Person(); p.使用
*
* 要想这样使用,首先必须得到class文件对象,其实也
* 就是得到Class类的对象。
* Class类:
* 成员变量 Field
* 构造方法 Construtor
* 成员方法 Method
*
* @author mzy
*
* 获取class类的对象的方式:
* A:Object类的getClass()方法
* B:数据类型的静态class
* C:Class类中的静态方法
* public static Class<?> forName(String className)
*
*
* 我们写的话:
* 获得Class对象,三种都可以;第二种最方便
*
* 开发:
* 第三种最好:因为第三种是一个字符串,
* 而不是一个具体的类名,这样我们就可
* 以把这样的字符串配置到配置文件中。
*
*
*
*
*/
public class ReflectDemo01_visit_three_methods {
public static void main(String[] args) throws ClassNotFoundException {
// 获得Class的方法(感叹号问题为泛型)
// 方式1:
Person p = new Person();
Class c = p.getClass(); Person p2 = new Person();
Class c2 = p2.getClass(); System.out.println(p == p2); // false
System.out.println(c == c2); // true // 方式2: 通过类名直接获得class对象
Class c3 = Person.class;
// 所有的数据类型都有它的class对象
// int.class;
// String.class;
System.out.println(c == c3); // true // 方式3:
/*
* 抛出ClassNotFoundException 6+ * 找不到
* 以后涉及到通过类的名称来找的
* 一定要写全路径(带包名的全路径)
* Class c4 = Class.forName("Perosn");
*
*
* 打开.java文件上的箭头,右键点 Copy Qualified Name
*/
Class c4 = Class.forName("reflex.Person");
System.out.println(c == c4); // true
}
}

其中的person类:

package reflex;

public class Person {
// 成员变量
private String name;
int age;
public String address; // 构造方法
public Person() {
} Person(String name, int age) {
this.name = name;
this.age = age;
}
private Person(String name) {
this.name = name;
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
} // 成员方法
public void show() {
System.out.println("show");
} public void method(String s) {
System.out.println("method" + s);
} public String getString(String s, int i) {
return s + "---" + i;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
} private void function() {
System.out.println("function");
} }