JavaEE进阶(20) Class字节码对象获取一个类中的字段值、公共构造方法、私有构造方法、创建对象、以及所有方法

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) {}
	
}

运行结果图:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值