反射机制

反射机制

  • 反射机制:在运行时,我们可以动态的获取类中的信息;在运行期间可以实例化对象、调用方法 属性等等
  • 所有的反射机制都是由字节码对象发起的

反射机制直接操作字节码文件,获取字节码对象:

Class class1=CC.class;//警告信息:Class是泛型
Class class2=Class.forName("com.kang4.CC");
Class class3=new CC().getClass();

获取类中的信息

class DD{
	public String hhh;
	protected int xxx;
	
 class CC extends DD{
	private String name;
	public Integer age;
	protected  int height;
	public static double aa;
		
	public CC(){	
	}
	public CC(String name){		
	}
public void aa(){
		
	}
	private void bb(int x){
		
	}
	public static void kk(){
			
}
public class MyReflect {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException{
		
        

获取类中定义的属性

Class class1=CC.class;

//获取类中定义的属性

//只能获取被public修饰的,还有从父类继承而来的public

Field[] fields=class1.getFields();

//获取本类(继承父类中的不可获取)中定义的所有的属性,不分静态非静态,都可获取。

Field[] fields=class1.getDeclaredFields();
  for(Field field:fields){
  	System.out.println(field);

//获取指定的属性对象
//只能获取public的
Field ageF=class1.getField("age");

//可以获取非public修饰的
	 Field ageF=class1.getDeclaredField("name");
	 System.out.println(ageF)

获取所有构造方法的信息

//只能获取public的
	 Constructor[] constructors=class1.getConstructors();
	 for(Constructor constructor: constructors){
		 System.out.println(constructor);
//可以获取私有的
Constructor[] constructors=class1.getDeclaredConstructors()
//获取指定的 为public的 构造方法,获取的为无参的
	Constructor constructor=class1.getConstructor();
//获取一个参数的,为String的,可以获取非public 的
	//基本数据类型也可以获取字节码信息(int.class)
	Constructor constructor2=class1.getDeclaredConstructor(String.class);

获取所有方法的信息

//获取的为public的
	Method[] methods=class1.getMethods();
	for (Method method : methods) {
		System.out.println(method)
//获取所有自己的方法
Method[] methods=class1.getDeclaredMethod();
//获取指定一个的方法
Method[] method=class1.getMethod(name, parameterTypes);
//name:方法名
//parameterTypes:参数类型
class1.getMethod("aa");//获取无参的
Method[] method=class1.getMethod("bb" ,int.class);

使用

public static void main(String [] args)throws InstantiationException,IllegalAccessExcption{
    Class class1=CC.class;
    //使用无参的构造方法创建对象
    Object obj=class1.newInstance();//新建对象
    System.out.println(obj); 
}
//使用构造方法对象创建当前实例
Constructor constructor=class1.getDeclaredConstructor(String.class);
//new CC("aa");
//非public访问需要授权
constrcutor.setAccessible(true);
Object cc=constructor.newInstance("aa")
//属性的调用
Field name= class1.getDeclaredField("name");
name.setAccessible(true);
name.set(obj,value);
//obj:成员变量  value:赋的值

//如果是静态变量,第一个参数设置为null
name.set(cc,"张三";//为cc对象的name属性赋值为张三

//获取cc对象的name属性的值
Systen.out.println(name.get(cc));
  

//方法的调用
Method aa = class1.getMethod("aa");
//调用了cc对象的aa方法
aa.invoke(cc);
//有参数
Method bb =class1.getDeclaredMethod("bb",int.class)
    //如果是静态方法将第一个参数设置为null即可
 bb.invoke(cc,10);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值