Java获取类信息的三种方法+通过反射获取私有属性

通过下面三种方法,我们可以获取到类的信息,包括类的名称、修饰符、父类、接口、字段、方法等信息。这些信息可以用于进行反射操作,例如动态创建对象、调用方法、访问字段等。

通过反射可以

1.使用Class.forName()方法
Class.forName()方法可以通过类的全限定名来获取类信息,例如:
Class<?> cls = Class.forName("com.example.MyClass");
这里,com.example.MyClass是类的全限定名,cls是获取到的类信息。需要注意的是,Class.forName()方法需要指定类的全限定名,如果类未被加载或不存在,会抛出ClassNotFoundException异常。

2.使用类字面常量
在Java中,我们可以使用类字面常量来获取类信息,例如:
Class<MyClass> cls = MyClass.class;
这里,MyClass.class是类字面常量,cls是获取到的类信息。需要注意的是,类字面常量只能用于已知类的情况,如果类未被加载或不存在,会抛出NoClassDefFoundError异常。

3.使用对象的getClass()方法
在Java中,我们可以使用对象的getClass()方法来获取类信息,例如:
MyClass obj = new MyClass();
Class<?> cls = obj.getClass();
这里,obj是一个MyClass类型的对象,cls是获取到的类信息。需要注意的是,getClass()方法只能用于已知对象的情况,如果对象为null,会抛出NullPointerException异常。

应用

1.创建一个类,它的name是私有的,怎样把Abc的实例对象设置name为“张三”呢???

可以通过反射。

public class Abc {
    private String name;

    @Override
    public String toString() {
        return "Abc{" +
                "name='" + name + '\'' +
                '}';
    }
}
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException{
        
        Abc a = new Abc();
        //把名字设置成张三
        Class cl = Abc.class;
        //获取Abc类中名为name的私有属性
        Field nameField = cl.getDeclaredField("name");
        //设置该属性的可访问性,俗称暴力反射
        nameField.setAccessible(true);
        nameField.set(a,"张三");
        System.out.println(a);

}

2.创建一个类,它的name是私有的,setName()方法是私有的,怎样把Abc的实例对象设置name为“张三”呢???

还是可以通过反射。

public class Abc {
    private String name;

    private void setName(String name) {
		this.name = name;
	}

	@Override
    public String toString() {
        return "Abc{" +
                "name='" + name + '\'' +
                '}';
    }
}
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException{
        
        Abc a = new Abc();
        Class<Abc> abcClass = Abc.class;
        //获取Abc类中名为setName的私有方法
        Method setName = abcClass.getDeclaredMethod("setName", String.class);
        setName.setAccessible(true);
        Object zhangsan = setName.invoke(a, "张三");
        System.out.println(a);
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的反射机制可以通过调用Class的getDeclaredField(String name)方法获取私有属性的Field对象,并通过调用Field对象的setAccessible(true)方法来设置私有属性的可访问性。然后,可以通过调用Field对象的get(Object obj)方法获取私有属性的值。 具体步骤如下: 1. 首先,通过Class的forName(String className)方法获取反射的Class对象。 2. 接下来,使用Class对象的getDeclaredField(String name)方法获取指定名称的私有属性的Field对象。 3. 在获取Field对象后,调用Field对象的setAccessible(true)方法设置私有属性的可访问性。 4. 最后,通过调用Field对象的get(Object obj)方法获取私有属性的值。 下面是一个示例代码: ```java public class ReflectExample { private String privateField = "私有属性的值"; public static void main(String[] args) throws Exception { Class<ReflectExample> reflectClass = ReflectExample.class; Field privateField = reflectClass.getDeclaredField("privateField"); privateField.setAccessible(true); ReflectExample reflectExample = new ReflectExample(); String value = (String) privateField.get(reflectExample); System.out.println("私有属性的值为:" + value); } } ``` 运行以上代码,输出结果为:"私有属性的值"。 反射机制很强大,可以通过获取私有属性的Field对象来获得和设置私有属性的值,但使用反射机制可能会降低代码的可读性和性能,所以在实际开发中要谨慎使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值