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"); } }