java之反射(2)属性field

#头条创作挑战赛#

通过反射可以得到字节码文件中的信息,比如字节码中的属性、方法、构造器等,是与类对应的。

今天学习属性field的一些api。设置一个User类,内容如下:

public class User {
    public int num;
    private double hight;
    protected String cname;
    static boolean sex;
    private static int age;

}

一、反射属性

先获取字节码文件:

Class cUser = Class.forName("org.example.dao.User");

getFields获取公开的属性,即带有public的

 Field[] fields = cUser.getFields();
        for (Field f : fields) {
            System.out.println(f);
        }

输出:public int org.example.dao.User.num

getDeclaredFields()获取所有的属性,无论是私有的还是公开的还是受保护的。返回的是一个field的数组。

     Field[] declaredFields = cUser.getDeclaredFields();
        for (Field item : declaredFields) {
            System.out.println("获取属性全名:" + item);
        }

输出结果:

获取属性全名:public int org.example.dao.User.num

获取属性全名:private double org.example.dao.User.hight

获取属性全名:protected java.lang.String org.example.dao.User.cname

获取属性全名:static boolean org.example.dao.User.sex

获取属性全名:private static int org.example.dao.User.age

获取属性全名:float org.example.dao.User.kg

如果你不想输出这么长的名字,可以用getName()获取短名

    Field[] declaredFields = cUser.getDeclaredFields();
        for (Field item : declaredFields) {
            System.out.println("获取属性简名:" + item.getName());
        }

输出结果:

获取属性简名:num

获取属性简名:hight

获取属性简名:cname

获取属性简名:sex

获取属性简名:age

获取属性简名:kg

获取类型名

   Field[] declaredFields = cUser.getDeclaredFields();
        for (Field item : declaredFields) {
            System.out.println("获取属性类型:" + item.getType());
        }

输出结果:

获取属性类型:int

获取属性类型:double

获取属性类型:class java.lang.String

获取属性类型:boolean

获取属性类型:int

获取属性类型:float


获取属性修饰符

       Field[] declaredFields = cUser.getDeclaredFields();
        for (Field item : declaredFields) {
            System.out.println("获取修饰符编号:" + item.getModifiers());
        }

输出结果:

获取修饰符编号:1
获取修饰符编号:2
获取修饰符编号:4
获取修饰符编号:8
获取修饰符编号:10
获取修饰符编号:0

输出的是一堆修饰符编号,什么都不加 是0 , public 是1 ,private 是 2 ,protected 是 4,static 是 8 ,final 是 16;可以用Modifier.toString()进行转换。

  Field[] declaredFields = cUser.getDeclaredFields();
        for (Field item : declaredFields) {         
            System.out.println("获取修饰符名字:" + Modifier.toString(item.getModifiers()));
        }

输出结果:

获取修饰符名字:public

获取修饰符名字:private

获取修饰符名字:protected

获取修饰符名字:static

获取修饰符名字:private static

获取修饰符名字:


二、类属性的获取:

Class cUser = Class.forName("org.example.dao.User");
System.out.println("获取字节码文件全名:" + cUser.getName());
System.out.println("获取字节码文件简单名:" + cUser.getSimpleName());
System.out.println("获取字节码文件修饰符:" + Modifier.toString(cUser.getModifiers()));

结果:

获取字节码文件全名:org.example.dao.User

获取字节码文件简单名:User

获取字节码文件修饰符:public

解析:

getName():是获取类的全限定名

getSimpleName():获取类的简单名字


三、以实例对象的方式设置属性值

用newInstance创建实例对象,

public class Client {
    public static void main(String[] args) throws Exception {
        Class cUser = Class.forName("org.example.dao.User");
//        User obj =(User) cUser.newInstance();
        Object obj = cUser.newInstance();
    }
}

用getDeclaredField获取单个的属性,这里不是getDeclaredFields哈,少了个s。

public class Client {
    public static void main(String[] args) throws Exception {
        Class cUser = Class.forName("org.example.dao.User");
//        User obj =(User) cUser.newInstance();
        Object obj = cUser.newInstance();
        Field hight = cUser.getDeclaredField("hight");     
    }
}

获取到属性后,给hight赋值,用hight.set(obj, 178);

hight:是要赋值的属性。

set:设置

obj:是给那个对象赋值

178:要设的属性值

public class Client {
    public static void main(String[] args) throws Exception {
        Class cUser = Class.forName("org.example.dao.User");
//        User obj =(User) cUser.newInstance();
        Object obj = cUser.newInstance();
        Field hight = cUser.getDeclaredField("hight");
        hight.set(obj, 178);        
    }
}

此时运行一下,发现报错了:

这是因为hight属性是一个私有的,不能设置属性值。

怎么办呢?可以用setAccessible(true);进行强制赋值。

public class Client {
    public static void main(String[] args) throws Exception {
        Class cUser = Class.forName("org.example.dao.User");
//        User obj =(User) cUser.newInstance();
        Object obj = cUser.newInstance();
        Field hight = cUser.getDeclaredField("hight");      
        hight.setAccessible(true);
        hight.set(obj, 178);      
    }
}

强制赋值之后就可以了,那我们怎么查看赋值的结果呢?

用hight.get(obj)查看结果:

hight:是要查看的属性

get:查询

obj:查询那个对象的属性值。

public class Client {
    public static void main(String[] args) throws Exception {
        Class cUser = Class.forName("org.example.dao.User");
//        User obj =(User) cUser.newInstance();
        Object obj = cUser.newInstance();
        Field hight = cUser.getDeclaredField("hight");
        System.out.println(hight.getName());
        hight.setAccessible(true);
        hight.set(obj, 178);
        System.out.println(hight.get(obj));
    }
}

展开阅读全文

页面更新:2024-04-29

标签:属性   赋值   全名   字节   反射   对象   编号   名字   类型   简单   文件

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top