版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38225558/article/details/82730180
Class字节码对象
1.获取公共构造方法、私有构造方法 getConstructor() getDeclaredConstructor()
2.获取构造方法创建对象 newInstance()
3.获取一个类里面所有的方法 getMethods()
4.获取一个类里面的字段值 getField()
ex:
/**
* Class字节码对象
* 1.获取公共构造方法、私有构造方法 getConstructor() getDeclaredConstructor()
* 2.获取构造方法创建对象 newInstance()
* 3.获取一个类里面所有的方法 getMethods()
* 4.获取一个类里面的字段值 getField()
* @author 郑清
*/
public class Demo {
public static void main(String[] args) throws Exception {
testClassGetConstructor();//字节码对象获取公共构造方法、私有构造方法
testClassGetObject();//字节码对象获取构造方法创建对象
testClassMethod();//字节码对象获取一个类里面所有的方法(包含这个类默认继承的父类Object里面的所有公共(public)的方法)
testField();//字节码对象获取一个类里面的字段值
}
public static void testClassGetConstructor() throws Exception{
System.out.println("========================字节码对象获取公共构造方法、私有构造方法=========================");
//获取类的字节码对象
Class cla = Student.class;
Constructor constructor = cla.getConstructor(String.class);//根据小括号中传入的字节码对象 获得指定参数类型(这里是:String)的构造方法
System.out.println(constructor);
//获取所有公共(public)的构造方法 然后遍历
Constructor[] constructors = cla.getConstructors();
for (Constructor constructor2 : constructors) {
System.out.println(constructor2);
}
//获取私有(private)的构造方法
Constructor declaredConstructor = cla.getDeclaredConstructor(int.class);
System.out.println(declaredConstructor);
//如果类中不存在的东西,用反射都是可以获取的,但是仅仅是编译不会报错,运行还是会报错
//Constructor declaredConstructor2 = cla.getDeclaredConstructor(double.class);
//System.out.println(declaredConstructor2);//NoSuchMethodException
}
public static void testClassGetObject() throws Exception{
System.out.println("==========================字节码对象获取构造方法创建对象============================");
//获取类的字节码对象
Class cla = Student.class;
//获取公共(public)的构造方法:
Constructor constructor = cla.getConstructor(String.class,int.class);
//创建对象 注意:上面获得的是带2个参数的构造方法==>所以这里使用获取的构造方法的时候 也必须写对应的参数 如果不写编译没问题,但运行会报错
Object newInstance = constructor.newInstance("String类型name",18);
System.out.println("newInstance:"+newInstance);
//获取私有(private)的构造方法
Constructor declaredConstructor = cla.getDeclaredConstructor(int.class);
//能获取但不能使用 ==》因为还是会检查权限
declaredConstructor.setAccessible(true);//忽略权限检查
//创建对象
Object newInstance2 = declaredConstructor.newInstance(18);
System.out.println("newInstance2:"+newInstance2);
System.out.println(newInstance2 instanceof Student);//true
}
public static void testClassMethod() throws Exception{
System.out.println("========字节码对象获取一个类里面所有的方法(包含继承的父类里面的所有公共(public)的方法)=========");
//获取类的字节码对象
Class cla = Student.class;
//获取无参公共(public)的构造方法
Constructor constructor = cla.getConstructor();
//创建对象
Object newInstance = constructor.newInstance();
//获取Student类里面所有公共(public)的方法(包括默认继承父类Object里面的所有公共(public)的方法)
Method[] methods = cla.getMethods();
for (Method method : methods) {
System.out.println(method);
}
//表示得到了一个方法,而且是cla所表示的类中的方法,对象方法
Method method = cla.getMethod("add", String.class);
method.invoke(newInstance, "1");
}
public static void testField() throws Exception{
System.out.println("======================字节码对象获取一个类里面的字段值=========================");
//获取类的字节码对象
Class cla = Student.class;
//获取无参公共(public)的构造方法 创建对象
Object obj = cla.getConstructor().newInstance();
//System.out.println(obj);//Student对象
//获取字段name
Field field = cla.getField("name");
//设置字段值 注意:字段值需要设置到某个对象上面去
field.set(obj, "String类型name值");
System.out.println(field.get(obj));
Student stu = (Student)obj;
System.out.println(stu.name);
}
}
class Student {
public String name;
public Student() {}
public Student(String name) {}
public Student(String name,int age) {}
private Student(int age) {}
public void add() {}
public void add(String name) {
System.out.println("这是add方法...");
}
private void add(String name,int age) {}
}
运行结果图: