获取Class对象的方式:
1. Class.forName("全类名");
将字节码加载进内存,返回Class对象,多用于配置文件,将类名定义在配置文件中,读取文件,加载类
2. 类名.class ;
通过类名的属性class获取,多用于参数的传递
3. 对象.getClass();
getClass()方法在object类中定义者,多用于对象的获取字节码方式
package Study; class User { public String toString() { return "User: 成功"; } public void func() { System.out.println("User: func"); } } public class reflect { public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException { System.out.println("方法一:"); Class<User> method1 = User.class; User user1 = method1.newInstance(); user1.func(); System.out.println(user1.toString()); System.out.println("方法二:"); Class<?> method2 = Class.forName("Study.User"); User user2 = (User) method2.newInstance(); user2.func(); System.out.println(user2.toString()); System.out.println("方法三:"); Class<?> method3 = new User().getClass(); User user3 = (User) method3.newInstance(); user3.func(); System.out.println(user3.toString()); } }
获取有构造函函数的类对象 class.getConstructor()
package Study; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; class A { String sex; public A(String sex) { this.sex = sex; } public void fun() { System.out.println("A. 性别:"+sex); } public void show() { System.out.println("A. "); } } class B extends A{ int age; int grade; String name; public B(String name, String sex) { super(sex); this.name = name; } public B(Integer a, Integer b) { super("女"); this.age = a; this.grade = b; } public B(int a, int b) { super("男"); this.age = a * 20; this.grade = b * 20; } public void show() { System.out.printf("B. name:%s, age=%d, grade:%d ", name, age, grade); } } class C { String sex; public C (String sex) { this.sex = sex; } public void fun() { System.out.println("C. 性别:"+sex); } } public class OYTT { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { /** 获取的构造函数一定要public * 一定要与构造函数的类型相同 */ Class<?> clsB = Class.forName("Study.B"); Constructor<?> ctorInt = clsB.getConstructor(int.class, int.class); B bInt = (B) ctorInt.newInstance(12, 78); bInt.show(); Constructor<?> ctorInteger = clsB.getConstructor(Integer.class, Integer.class); B bInteger = (B) ctorInteger.newInstance(12, 78); bInteger.show(); Constructor<?> ctorStr = clsB.getConstructor(String.class, String.class); B bStr = (B) ctorStr.newInstance("LiMing", "青年"); bStr.show(); System.out.println("------------------------"); A bStrFather = (B) ctorStr.newInstance("LiMing", "青年"); bStrFather.fun(); bStrFather.show(); A bStrFather1 = (A) ctorStr.newInstance("LiMing", "青年"); bStrFather.fun(); bStrFather.show(); System.out.println("----------A--------------"); Class<?> clsA = Class.forName("Study.A"); Constructor<?> ctorA1 = clsA.getConstructor(String.class); A a = (A) ctorA1.newInstance("alis"); a.fun(); C c = (C) ctorA1.newInstance("alis"); c.fun(); // 这样报错, 只能返回对象自己或者接口,父类等 } }
获取有参数的构造函函数的类对象 class.getConstructor(xx.class).newInstance(xx, xx)
package Study; import java.lang.reflect.InvocationTargetException; public class TestLzw { public TestLzw(int x, Integer y) { System.out.println("构造器, x:"+x+" y:"+y); } public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { var aa1 = TestLzw.class.getPackageName(); System.out.println("获取类包名: "+aa1); String className = "Study.TestLzw"; System.out.println(Class.forName(className)); System.out.println(TestLzw.class); System.out.println(className.getClass()); Class<?> aa2 = Class.forName(className); aa2.getConstructor(int.class, Integer.class).newInstance(3, 4); } }