java之反射基础

1、反射是什么

  反射机制是在运行状态中,对任意的一个类,都可以知道这个类的所有方法和属性; 对于任何一个对象,都可以调用他的任意方法和属性,这种<动态获取/font>的信息以及动态调用对象的方法称为java的反射机制。

2、反射的作用

  • 1、反编译: .class–>java
  • 2、通过反射机制访问对象的属性,方法,构造方法等

3、反射的具体实现

3、1反射相关的类

  • java.lang.Class;
  • java.lang.reflect.Constructor;
  • java.lang.reflect.Field;
  • java.lang.reflect.Method;
  • java.lang.reflect.Modifier;

3.2 获取大Class对象的三种方式

由于任何类都是Object的子类而Object中有getClass可以获取Class对象
- public final native Class<?> getClass();
-

package com.chb.reflectTest;
public class Test {
    public static void main(String[] args) throws Exception {
        //第一种方式:
        Class<?> c1 = Class.forName("com.chb.reflectTest.Test");
        //第二种方式:java中每个类都有class属性
        Class<?> c2 = Test.class;
        //第三种方式:每个对象都与getClass()方法
        Class<?> c3 = new Test().getClass();
    }
}   

3.3创建对象

  获取Class对象以后,使用它创建对象,通过newInstance()调用无参构造函数进行创建对象,newInstance()返回一个Object对象:

Class<?> c1 = Class.forName("com.chb.reflectTest.Test");
Object o1 = c1.newInstance(); 

3.4、获取数据

  分为所有属性和制定的属性

3.4.1、获取所有属性

  • 获取修饰

    • 首先通过属性的getModifiers()获取修饰对象,
    • 再通过java.long.reflect.Modifier的toString()打印类,属性的修饰(public , static ,final等)。
  • 获取属性

    • 获取所有属性:通过Class对象的getDeclaedFields(),返回一个Filed的数组**。
  • 获取属性的类型:

    • 通过属性对象(Field对象)的getType()
Class<?> cString = Class.forName("java.lang.String");
        //获取累的修饰和名称
        System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n");
        //获取所有属性
        Field[] fields = cString.getDeclaredFields();
        for (Field field : fields) {
            System.out.print("\t");
            System.out.print(
                    Modifier.toString(field.getModifiers())+" "//属性的修饰
                  + field.getType().getSimpleName()+" "
                  + field.getName()+"\n");           
        }
        System.out.println("}");

3.4.2 获取指定属性

创建测试对象:
注意: 我在Use类中定义了两个属性, 一个public ,一个private ,是为了下一个测试反射可以打破封装性

package com.chb.reflectTest;

public class User {
    private String name;
    public  String nickName;
    public User() {}
    public User(String name, String nickName) {
        this.name = name;
        this.nickName = nickName;
    }
    setter getter...

}

传统属性的获取和通过反射获取对比:

package com.chb.reflectTest;

import java.lang.reflect.Field;


public class Test1 {
    public static void main(String[] args) throws Exception {
        //传统获取属性的值
        //1、通过getter,setter
        User user1 = new User();
        user1.setName("lisi");
        System.out.println(user1.getName());
        //2、直接调用属性
        User user2 = new User();
        user2.nickName = "癞皮狗";
        System.out.println(user2.nickName);
        //=========================================
        //通过反射来设置,获取属性。
        Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User");
        User user = c1.newInstance();
        Field nickField = c1.getDeclaredField("nickName");
        nickField.set(user, "123");
        System.out.println(nickField.get(user));

        Field nameFiled = c1.getDeclaredField("name");
        //Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private"
        nameFiled.setAccessible(true);
        nameFiled.set(user, "oup");
        System.out.println(nameFiled.get(user));

    }
}

通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
会出现访问错误, 也就是java的安全访问机制,报错:

Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private"

我们通过一个方法·来打破java的封装性:

nameFiled.setAccessible(true);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值