`
xuanzhui
  • 浏览: 200878 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java反射基础

    博客分类:
  • Java
阅读更多

1. 第一步的核心是获取Class

常规情况下,一个class的二进制文件唯一对应jvm中的一个class对象,class的加载大部分情况都是jvm自动处理,对于动态加载的情况,一种是通过Class.forName,另一种是通过ClassLoader.loadClass(),这两种方式都可以加载classpath下的class二进制文件,关于classpath的获取

How to print out the current project classpath

Find where java class is loaded from

 

ClassLoader.loadClass()的优势是可以自定义ClassLoader,以实现自定义class二进制字节码的加载地址,比如实现加载网络上的class二进制文件。

 

以下方式都会返回Class的实例

Class.forName()

ClassLoader.loadClass()

ClassName.class

objectName.getClass()

 

2. 获取class简要信息

void checkClass(String className) throws ClassNotFoundException {
    Class bclass = Class.forName(className);
    System.out.println("class name: " + bclass.getSimpleName());
    System.out.println();

    int modifier = bclass.getModifiers();
    System.out.println("is class public: " + Modifier.isPublic(modifier));
    System.out.println();

    Package pac = bclass.getPackage();
    System.out.println("package name: " + pac.getName());
    System.out.println();

    Class sclass = bclass.getSuperclass();
    System.out.println("super class: " + sclass.getName());
    System.out.println();

    Class[] inters = bclass.getInterfaces();
    System.out.println("implemented interface: ");
    for (Class cls : inters)
        System.out.println("\t" + cls.getName());
    System.out.println();

    Constructor[] constructors = bclass.getConstructors();
    System.out.println("constructors:");
    for (Constructor c : constructors) {
        System.out.println("\t" + c.getName());

        for (Class cls : c.getParameterTypes())
            System.out.println("\t\tparam type: " + cls.getName());
    }
    System.out.println();

    System.out.println("own methods:");
    for (Method mth : bclass.getDeclaredMethods()) {
        System.out.println("\t" + mth.getName());

        for (Class cls : mth.getParameterTypes())
            System.out.println("\t\tparam types: " + cls.getName());

        System.out.println("\t\treturn types: " + mth.getReturnType().getName());
    }
    System.out.println();

    System.out.println("fields:");
    for (Field f : bclass.getFields()) {
        System.out.print("\t" + f.getName());
        System.out.println("\t:" + f.getType().getName());
    }
}

 refer Java Reflection

 

3. 通过反射的方式查看Object里面的变量

1) getFields可以获取所有的public类型成员变量,包含所有父类的public变量

2) getDeclaredFields可以获取当前类的所有成员变量,包含private类型,但是不包含父类

以下通过循环的方式获取所有成员变量的信息

static Map<String, Object> objectToMap(Object object) {
    Map<String, Object> map = new HashMap<>();

    Class cls = object.getClass();
    while (cls != null) {
        System.out.println(cls.getName());

        for (Field field : cls.getDeclaredFields()) {
            field.setAccessible(true);

            Object value = null;
            try {
                value = field.get(object);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            System.out.println(field.getName() + " # " + value);
            if (value != null)
                map.put(field.getName(), value);
        }

        cls = cls.getSuperclass();

        System.out.println("=====================");
    }

    return map;
}

 

 

4. 通过反射的方式创建一个新的对象

假设有一个class

public class MyObject {
    private int code;
    private String msg;

    public MyObject(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

1) MyObject可能会有子类,所有的子类都会有(int, String)这样的构造函数,那么所有的子类都可以通过如下的方式创建

public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
    MyObject object = newInstance(MyObject.class, 1, "succ");
    System.out.println(object.getCode() + " # " + object.getMsg());
}

static MyObject newInstance(Class<? extends MyObject> classType, int code, String msg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    Constructor<? extends MyObject> constructor = classType.getConstructor(int.class, String.class);
    return constructor.newInstance(code, msg);
}

 

2) 通过Class的newInstance()方式创建一个对象,前提是该Class有默认构造函数或无参构造函数

 

 

 

分享到:
评论

相关推荐

    Java反射性能测试分析

    #### Java反射基础 Java反射主要依赖于以下几类API: - `java.lang.Class`: 提供了获取类信息的方法。 - `java.lang.reflect.Field`: 允许访问和修改类的字段。 - `java.lang.reflect.Method`: 用于调用类的方法。 ...

    java反射操作父类所有属性和方法

    #### 二、Java反射基础 在深入讨论如何操作父类之前,我们先简要回顾一下Java反射的基本概念: - **Class**: 每个类都有一个与之对应的`Class`对象,它是反射的基础。 - **Constructor**: 用于创建类的新实例。 - ...

    java反射笔记

    关于标签"反射基础",在Java反射基础中,还包括了泛型信息的获取、接口实现类的判断、注解的处理等内容: 1. 泛型信息:虽然Java泛型在编译后会被擦除,但通过反射仍可以获取到泛型的实际类型。 2. 接口实现:`Class...

    新手学习java反射基础

    Java 反射基础知识点 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。下面我们来一起学习一下吧。 一、...

    java反射入门

    Java反射是Java语言的一个重要特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。反射机制使得代码能够动态地获取类的信息并调用其方法,增加了程序的灵活性和可扩展性。以下将详细介绍Java反射中的几...

    Java反射基础入门,一篇就够啦

    Java反射基础入门 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。本文将详细介绍Java反射的基础知识,包括反射的基本概念、工作原理、使用方法及优缺点。...

    基于java反射的验证框架

    一、Java反射基础 Java反射机制是在运行时分析类的能力,包括获取类的信息(如类名、属性、方法等)、创建对象、调用方法、访问和修改属性。通过Class类、Constructor类、Method类和Field类,我们可以动态地获取和...

    JAVA反射教程有代码

    1. **Java反射基础** - **Class对象**:每个类在Java运行时都有一个对应的Class对象,可以通过`Class.forName()`或对象的`getClass()`方法获取。 - **构造器**:通过`Class.newInstance()`或`Constructor.new...

    java反射的简单代码例子

    1. **Java反射基础** - **Class对象**:每个类在内存中都有一个Class对象,它代表了类的信息。我们可以通过`Class.forName()`方法或者`某个类.class`来获取Class对象。 - **Constructor对象**:表示类的构造器,...

    java反射,获取所有属性、方法以及List集合类

    首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`方法或者对象的`getClass()`方法来获取`Class`对象。一旦我们有了`Class`对象,就可以进一步...

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    java反射 详解 入门到掌握

    1. **Java反射基础** - **Class对象**:每个类在内存中都有一个Class对象,它代表了这个类的信息。通过`Class.forName()`方法或者对象的`getClass()`方法可以获取到Class对象。 - **构造器与对象创建**:通过`...

    java反射视频

    ### Java反射基础 1. **Class类与反射**:在Java中,所有类都继承自`java.lang.Class`类。通过`Class`对象可以获取类的各种信息并进行操作。例如,可以通过类名或对象获取`Class`实例,进而调用其方法获取类名、...

    java反射源代码

    一、Java反射的基础概念 Java反射源于Java.lang.Class类,它代表了Java运行时的类信息。通过Class对象,我们可以获取到类的构造器、方法、字段等信息,甚至可以动态地实例化对象和调用其成员。例如,`Class&lt;?&gt; ...

    java反射机制基础

    java反射机制基础,是进入java反射机制的一把钥匙

    JAVA反射详细讲解

    一、反射基础 1. 类与对象的元数据:在Java中,每个类都由Class对象表示,这个对象包含了关于类的所有信息,如类名、构造器、方法、字段等。通过Class类,我们可以获取到运行时的类信息。 2. 获取Class对象:有三...

    java反射原理

    #### 一、Java反射基础 ##### 1.1 Java虚拟机方法区 Java虚拟机(JVM)中包含了多种运行时数据区,包括方法区、堆区和栈区等。其中,**方法区**是用于存储已被加载的类信息的重要区域。当JVM加载某个类时,类加载...

    java反射机制文档及代码

    在本资料"java反射机制文档及代码"中,详细介绍了Java反射的基础知识和常见应用。 首先,反射的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们可以获取到类的名称、包名、属性、构造器、...

    Java反射机制 Java反射机制

    随着面向对象编程的发展,动态类型和动态绑定的概念逐渐成熟,这为Java反射机制的出现奠定了基础。Java反射机制在JDK 1.1版本中就已经引入,但在JDK 1.5之后得到了进一步增强和完善,增加了泛型支持等功能,使得反射...

    实战java反射机制-让你迅速认识java强大的反射机制

    1. 反射基础: Java反射机制主要基于`java.lang.Class`类和`java.lang.reflect`包中的接口和类。`Class`对象代表了运行时的类信息,通过`Class.forName()`方法可以获取到类的`Class`对象。此外,`java.lang.reflect...

Global site tag (gtag.js) - Google Analytics