反射四大核心操作——基础(一)

反射:对象的反向处理操作;(没有反射,就没有Java的任何框架)

反射四大核心操作:Class、Constructor、Method、Field

1、Class:

  • Class 类的三种实例化方式:  
  1. 任意对象.getclass
  2. 类名.class
  3. 调用Class的静态方法,Class.forName(类的全名称)
  • 利用Class对象反射创建类的对象
  1. Class取得对象;
  2. 根据Class对象创建新对象;(newInstance 默认调用无参构造)
Class<?> cls=Class.forName("java.util.Date");//取得对象
Object obj=cls.newInstance();//等价于 java.util.Data
  • 取得父类信息:类的包名称、父类的Class对象、实现的父接口
    Class<?> cls=myclass.class;
    //取得包名称
    System.out.println( cls.getPackage().getName());
    //取得父类对象
    System.out.println(cls.getSuperclass().getName());
    //取得父接口
    Class<?>[] icls=cls.getInterfaces();
    for (Class<?> cls1 : icls) {
		System.out.println(cls1);
	}

2、Constructor

  • getConstructor(参数)取得类中的构造方法;(public)—>public Constructor<T> getConstructor(参数);
//取得对象 
Class<?> cls=myclass.class;  
//取得Constructor对象 
Constructor<?> constructor=cls.getConstructor(String.class);
//实例化对象 
myclass mc=(myclass) constructor.newInstance("fay");
System.out.println(mc);
	
  • getConstructors()取得类中所有的构造方法;(public)—>public Constructors<T> getConstructors();
    //取得对象    
	Class<?> cls=myclass.class;   
	//取得所有构造方法
	Constructor<?>[] constructor=cls.getConstructors();
	//输出
	for (Constructor<?> constructor2 : constructor) {
		System.out.println(constructor2);
	}
	//调用
	myclass mc1=(myclass) constructor[0].newInstance("fay");	
	myclass mc2=(myclass) constructor[1].newInstance("ff",18);
	System.out.println(mc1);
	System.out.println(mc2);
	
  •  getDeclaredConstructor()、getDeclaredConstructors()   取得类中所有的构造方法,与修饰符无关;  

3、Method

  • 取得所有普通方法;

     getMethods[ ] :返回班类及父类所有的public方法;
     getDeclaredMethods[ ]:返回本类所有普通方法,与修饰符无关;

  • 取得指定方法 ;

     getMethod(方法名,方法参数)
     getDeclaredMethod(方法名,方法参数)

  • 调用;

     Method Object invoke(类的实例化对象,方法具体参数)

    //取得对象    
	Class<?> cls=myclass.class; 
	Object obj=cls.newInstance();
	//取得所有方法
	Method[] methods=cls.getDeclaredMethods();
	for (Method method : methods) {
		System.out.println(method);
	}
	//取得指定的Method方法
	Method setmethod=cls.getMethod("setAge", int.class);
	setmethod.invoke(obj, 18);
	Method getmeyhod=cls.getMethod("getAge");
	Object result=getmeyhod.invoke(obj);
	System.out.println(result);

4、 Field 

  • 取得所有类中属性:

      getFields()
      getDeclaredFields()

  • 取得类中指定属性

       getField(属性名)
       getDeclaredField(属性名)

  • 调用:

       设置属性内容:public void set(具体实例化对象,属性值)

       取得属性内容:public Object  get(具体实例化对象)

    //取得对象    
	Class<?> cls=myclass.class; 
	//实例化
    myclass mc=(myclass) cls.newInstance();
    //取得指定属性
	Field field=cls.getDeclaredField("age");
	//属性为private,需要破坏封装(默认flase)
	field.setAccessible(true);
	//field 提供的set(实例化对象,具体参数)
	field.set(mc, 18);
	//field 提供的get(实例化对象)
	Object object=field.get(mc);
	System.out.println(object);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值