• 反射调用成员属性


    成员属性保存了一个对象的所有信息,通过反射可以实现成员属性的赋值与取值操作,本课程主要讲解了属性的直接操作,以及封装性取消等操作。

    1.获取类中的成员属性信息

     1 package com.youtube.demo;
     2 
     3 import java.lang.reflect.Field;;
     4 
     5 interface IChannelService{
     6     public static final String NAME = "youtube";
     7 }
     8 abstract class AbsBase{
     9     protected static final String BASE = "www.youtube.com";
    10     private String info = "Hello, youtube";
    11 }
    12 class Member extends AbsBase implements IChannelService{
    13     private String name;
    14     private int age;
    15 }
    16 public class JavaReflectDemo {
    17     public static void main(String[] args) {
    18         Class <?> cls = Member.class;
    19         {
    20             Field fields[] = cls.getFields();
    21             for(Field field:fields) {
    22                 System.out.println(field);
    23             }
    24         }
    25         System.out.println("----------------华丽的分割线------------------");
    26         {
    27             Field fields[] = cls.getDeclaredFields();
    28             for(Field field:fields) {
    29                 System.out.println(field);
    30             }
    31         }
    32     }
    33 }

    运行结果:

    public static final java.lang.String com.youtube.demo.IChannelService.NAME
    ----------------华丽的分割线------------------
    private java.lang.String com.youtube.demo.Member.name
    private int com.youtube.demo.Member.age

    2.反射操作成员属性内容:

     1 package com.facebook.demo;
     2 import java.lang.reflect.Field;
     3 class Member{
     4     private String name;
     5 }
     6 public class JavaReflectDemo {
     7     public static void main(String[] args) throws Exception {
     8         Class<?> cls = Member.class;
     9         Object obj = cls.getDeclaredConstructor().newInstance();
    10         Field nameField = cls.getDeclaredField("name");
    11         nameField.setAccessible(true);//解除封装
    12         nameField.set(obj, "小李老师");
    13         System.out.println(nameField.get(obj));
    14     }
    15 }

    运行结果:

    小李老师

    如果不解除封装,会抛如下异常:

    Exception in thread "main" java.lang.IllegalAccessException: class com.facebook.demo.JavaReflectDemo cannot access a member of class com.facebook.demo.Member with modifiers "private"
        at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:355)
        at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:639)
        at java.base/java.lang.reflect.Field.checkAccess(Field.java:1075)
        at java.base/java.lang.reflect.Field.set(Field.java:778)
        at com.facebook.demo.JavaReflectDemo.main(JavaReflectDemo.java:11)

    3.获取指定属性类型:

     1 package com.facebook.demo;
     2 import java.lang.reflect.Field;
     3 class Member{
     4     private String name;
     5 }
     6 public class JavaReflectDemo {
     7     public static void main(String[] args) throws Exception {
     8         Class<?> cls = Member.class;
     9         Object obj = cls.getDeclaredConstructor().newInstance();
    10         Field nameField = cls.getDeclaredField("name");
    11         System.out.println(nameField.getType().getName());
    12         System.out.println(nameField.getType().getSimpleName());
    13     }
    14 }

    运行结果:

    java.lang.String
    String
  • 相关阅读:
    <转>MSDN上关于XPath的语法文章
    <转>正则表达式语法
    <转>反射技术的简单介绍
    <转>css中用expression实现js的onmouseover/onmouseout事件
    <转>在xslt中实现split方法对查询字符串进行分隔
    <转>SQL Server中的XML数据进行insert、update、delete
    <转>VS2010项目转换到VS2008下方法
    <转>在xslt 1.0 中取得当前时间
    C# 发送邮件的Helper类
    DataTable 类的学习笔记
  • 原文地址:https://www.cnblogs.com/sunzhongyu008/p/11219278.html
Copyright © 2020-2023  润新知