获取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 \n", 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);
}
}