反射操作属性

取得类加载器和接口:

可以通过反射取得当前的类的加载器或者类的接口:

取得加载器:

package com.sxt;
public class Test {
    public static void main(String[] args) throws Exception {
        //取得反射对象
        Class<?>  empClass=Class.forName("com.sxt.Emp");
        //使用反射取得Emp类的加载器
        System.out.println(empClass.getClassLoader());
        System.out.println(ClassLoader.getSystemClassLoader());
    }
}

取得类的接口:

package com.sun;
public class Test {
    public static void main(String[] args) throws Exception {
        //取得反射对象
        Class<?>  empClass=Class.forName("com.sun.vo.Emp");
        //使用反射取得Emp类的接口
        System.out.println(empClass.getInterfaces()[1].getName());
    }
}

在这里插入图片描述
取得类的全名称和简单名称:

package com.sun;
public class Test {
    public static void main(String[] args) throws Exception {
        //取得反射对象
        Class<?>  empClass=Class.forName("com.sun.vo.Emp");
        //使用反射取得Emp类的名称
        System.out.println(empClass.getName());
        System.out.println(empClass.getSimpleName());
    }
}

在这里插入图片描述

反射操作属性:

反射操作了构造方法,那么也可以使用反射操作属性,同样的要操作属性首先要取得属性,在Class类中提供了取得属性的相关方法,返回值类型的“java.lang.reflect.Field”

在Class类中取得属性的相关方法有:

public Field getDeclaredField(String name)

【返回所有属性,参数是属性的名称】

public Field getField(String name)

【返回public修饰的属性,参数是属性的名称】

public Field[] getDeclaredFields()

【取得所有属性,返回的是一个数组】

public Field[] getFields()

【取得所有public修饰的属性,返回的是一个数组】

以上的方法的返回值都与Filed类型有关,我们观察该类中的方法:

public Object get(Object obj)

【取得属性值,参数是该属性所在的对象】

public String getName()

【取得属性名称】

public Class<?> getType()

【取得属性类型的Class类对象】

public void set(Object obj, Object value)

【为属性赋值,第一个参数:属性所在的对象,第二个参数:赋值的内容】

public void setAccessible(boolean flag)

【取消私有封装】

操作属性:
package com.sun;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Date;
public class Test {
    public static void main(String[] args) throws Exception {
        //取得反射对象
        Class<?>  empClass=Class.forName("com.sun.vo.Emp");
        //创建一个Emp类对象
        Constructor  con=empClass.getConstructor(Integer.class,String.class,String.class,Double.class,Double.class,Integer.class,Integer.class, Date.class
        );
        Emp emp=(Emp)con.newInstance(1001,"张三","clerck",3000.00,1000.00,1002,10,new Date());
        //取得属性对象
        Field  f=empClass.getDeclaredField("ename");
        //取得属性的值(表示取得em对象的ename属性值)
        System.out.println(f.get(emp));
    }
}

在这里插入图片描述

取消私有属性的封装

package com.sun;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Date;
public class Test {
    public static void main(String[] args) throws Exception {
        //取得反射对象
        Class<?>  empClass=Class.forName("com.sun.vo.Emp");
        //创建一个Emp类对象
        Constructor  con=empClass.getConstructor(Integer.class,String.class,String.class,Double.class,Double.class,Integer.class,Integer.class, Date.class
        );
        Emp emp=(Emp)con.newInstance(1001,"张三","clerck",3000.00,1000.00,1002,10,new Date());
        //取得属性对象
        Field  f=empClass.getDeclaredField("ename");
        //为属性取消private权限
        f.setAccessible(true);
        //为属性重新复制
        f.set(emp,"李四");
        //取得属性的值(表示取得em对象的ename属性值)
        System.out.println(f.get(emp));
    }
}

在这里插入图片描述
取得所有属性:

package com.sun;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Date;
public class Test {
    public static void main(String[] args) throws Exception {
        //取得反射对象
        Class<?>  empClass=Class.forName("com.sun.vo.Emp");
        //创建一个Emp类对象
        Constructor  con=empClass.getConstructor(Integer.class,String.class,String.class,Double.class,Double.class,Integer.class,Integer.class, Date.class
        );
        Emp emp=(Emp)con.newInstance(1001,"张三","clerck",3000.00,1000.00,1002,10,new Date());
        //取得所有的属性
        Field  [] fs=empClass.getDeclaredFields();
        for(Field  f:fs){
            f.setAccessible(true);
            System.out.println(f.getName()+"="+f.get(emp));
        }
    }
}

在这里插入图片描述

总结:

1、操作属性其实还可以使用操作setter方法和getter方法实现属性的操作。

2、Constructor(构造方法的类)、Method(表示普通方法的类)、Field(表示属性的类),这三个类有一个共同的父类(java.lang.reflect.AccessibleObject)。

3、反射还可以操作注解,注解是后面的内容,当我们讲完注解的时候再使用反射进行操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值