当前位置 : 主页 > 编程语言 > java >

《Java 核心技术 卷1》 笔记 第五章 继承(10)反射

来源:互联网 收集:自由互联 发布时间:2022-07-13
5.7.4 反射对运行时对象分析 Field f = clazz.getField("fieldName"); Object v = f.get(obj); public class Main { public static void main ( String [] args ) throws ClassNotFoundException , NoSuchFieldException , IllegalAccessException


5.7.4 反射对运行时对象分析

Field f = clazz.getField("fieldName");
Object v = f.get(obj);

public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
Main solution = new Main();
Test t = solution.new Test(3,5);
System.out.println(t.getClass().getDeclaredField("a").get(t));
System.out.println(t.getClass().getDeclaredField("b").get(t));
}

class Test{
int a;
private int b;
public Test(int a,int b){
this.a = a;
this.b = b;
}
}
}



《Java 核心技术 卷1》 笔记 第五章 继承(10)反射_核心技术

私有属性,需要开启访问权限:setAccessible()



public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
Main solution = new Main();
Test t = solution.new Test(3,5);
System.out.println(t.getClass().getDeclaredField("a").get(t));
Field fb = t.getClass().getDeclaredField("b");
fb.setAccessible(true);
System.out.println(fb.get(t));
fb.setAccessible(false);
}

class Test{
int a;
private int b;
public Test(int a,int b){
this.a = a;
this.b = b;
}
}
}


《Java 核心技术 卷1》 笔记 第五章 继承(10)反射_p2p_02

查看类中属性信息与子类属性信息:

  • 类中当前属性,并打印当前属性信息;
  • 子类中当前属性,并打印当前属性信息,是基本类型(isPrimitive)的直接打印;


  • import java.lang.reflect.AccessibleObject;
    import java.lang.reflect.Array;
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    import java.util.HashSet;
    import java.util.Set;

    public class ObjectAnalyzer {
    private static Set<Object> visited = new HashSet<>();
    public static String toString(Object obj){
    if(obj == null) return "null";
    if(visited.contains(obj))
    return "...";
    visited.add(obj);
    Class c1 = obj.getClass();
    if(c1==String.class)
    return (String) obj;
    if(c1.isArray()){
    StringBuilder sb = new StringBuilder(c1.getComponentType()+"[]{");
    for(int i = 0; i < Array.getLength(obj); i++){
    if(i>0)
    sb.append(",");
    Object val = Array.get(obj,i);
    if(c1.getComponentType().isPrimitive())
    sb.append(val);
    else
    sb.append(toString(val));
    }
    return sb.append("}").toString();
    }

    StringBuilder sb = new StringBuilder(c1.getSimpleName());
    do{
    sb.append("[");
    Field[] fields = c1.getDeclaredFields();
    AccessibleObject.setAccessible(fields,true);
    for(Field f:fields){
    if(!Modifier.isStatic(f.getModifiers())){
    if(sb.lastIndexOf("[")!=sb.length()-1)
    sb.append(",");
    sb.append(f.getName()).append("=");
    try{
    Class t = f.getType();
    Object val = f.get(obj);
    if(t.isPrimitive())
    sb.append(val);
    else
    sb.append(toString(val));
    }catch (Exception e){
    e.printStackTrace();
    }
    }
    }
    sb.append("]");
    c1 = c1.getSuperclass();
    }while (c1!=null);
    return sb.toString();
    }
    }



    import editor.cn.com.book.ObjectAnalyzer;

    public class Main {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {

    Main solution = new Main();

    Test t = solution.new Test(3,5);

    System.out.println(ObjectAnalyzer.toString(t));

    }



    class Test{

    int a;

    private int b;

    public Test(int a,int b){

    this.a = a;

    this.b = b;

    }

    }

    }



    《Java 核心技术 卷1》 笔记 第五章 继承(10)反射_java_03

      系列内容:

    《Java 核心技术 卷1》 笔记:第一章 Java程序设计概述

    《Java 核心技术 卷1》 笔记:第二章 Java程序设计环境

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(1)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(2)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(3)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(4)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(5)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(6)

    《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(7)大数处理、数组、多维数组、控制台传参

    《Java 核心技术 卷1》 笔记 第四章:类与对象

    《Java 核心技术 卷1》 笔记 第四章:类与对象(2) GregorianCalendar 与 类的基本组成

    《Java 核心技术 卷1》 笔记 第四章:类与对象(3) 构造器全局私有方法

    《Java 核心技术 卷1》 笔记 第四章:类与对象(4) 静态字段+静态方法+工厂方法

    《Java 核心技术 卷1》 笔记 第四章:类与对象(5) 形参与实参 构造器的默认值与默认构造

    《Java 核心技术 卷1》 笔记 第四章:类与对象(6) 构造器调用与初始化块

    《Java 核心技术 卷1》 笔记 第四章:类与对象(7) 注释、JavaDoc与类设计

    《Java 核心技术 卷1》 笔记 第五章 继承

    《Java 核心技术 卷1》 笔记 第五章 继承(2)

    《Java 核心技术 卷1》 笔记 第五章 继承(3)

    《Java 核心技术 卷1》 笔记 第五章 继承(4)equals方法

    《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString

    《Java 核心技术 卷1》 笔记 第五章 继承(6) 泛型

    《Java 核心技术 卷1》 笔记 第五章 继承(7) 包装类和可变数组

    《Java 核心技术 卷1》 笔记 第五章 继承(8) 枚举类与类反射

    《Java 核心技术 卷1》 笔记 第五章 继承(9) 异常捕获与反射运用

    喜欢的话,点个赞吧~!平时做题,以及笔记内容将更新到公众号。

    关注公众号,互相学习:钰娘娘知识汇总

    《Java 核心技术 卷1》 笔记 第五章 继承(10)反射_核心技术_04


    网友评论