Java反射---Class对象,获得类的方法、成员变量和构造函数信息

简介: 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/73848985 Class类任何一个类都是Class类的实例,而我们常见的对象,是用普通的类实例化出来的,也就是Class类的实例的实例。
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/73848985

Class类

任何一个类都是Class类的实例,而我们常见的对象,是用普通的类实例化出来的,也就是Class类的实例的实例。一个普通的类Foo的Class实例有三种表示方式:
- 1、知道类名获取Foo的Class实例
Class c1 = Foo.class;
- 2、通过Foo对象获得Foo的Class实例
Class c2 = foo.getClass();
- 3、通过forName()获得实例
Class c3 = Class.forName("test.reflect.Foo");

这三者是相等的:

System.out.println(c1 == c2&&c2 == c3);
// True 

可以用Class的实例创建Foo的实例:

Foo foo2 = (Foo)c1.newInstance();

动态加载类

1、静态加载类。编译时加载类,在编译时刻就需要加载所有的可能的使用到的类。所有的类都会加载,不管有没有被使用
2、动态加载类。运行时加载类

使用Class.forName()动态加载类

    public static void main(String [] args){
        try{
            Class c = Class.forName(args[0]);
            // OfficeUtil 是接口
            OfficeUtil obj = (OfficeUtil)c.newInstance();
            obj.print();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

使用了OfficeUtil接口的Word类

class Word implements OfficeUtil{
    public void print(){
        System.out.println("Word");
    }
}

使用了OfficeUtil接口的Excel类

class Excel implements OfficeUtil{
    public void print(){
        System.out.println("Excel");
    }
}

OfficeUtil接口

interface OfficeUtil{
    public void print();
}

获得类类型的信息

通过Class类的对象获得某个类的信息
- getName() 返回类类型的名称
- getSimpleName() 返回类类型的名称的简写

获得类名:

        Class c1 = int.class;
        Class c2 = String.class;
        Class c3 = void.class;
        Class c4 = double.class;
        Class c5 = Double.class;
        System.out.println(c1.getName());
        System.out.println(c2.getName());
        System.out.println(c3.getName());
        System.out.println(c4.getName());
        System.out.println(c5.getName());

结果:

    int
    java.lang.String
    void
    double
    java.lang.Double

getSimpleName()和getName():

java.lang.String    // getName()
String              // getSimpleName()

Method对象

方法也是对象,一个成员方法就是一个Method对象实例。method实例有以下常用方法:
- getReturnType() 获得返回值,返回的是 Class

    public static void printClassMethodMessage(Object obj){
        // 获得对象的类类型
        Class data = obj.getClass();
        // 获得类类型的名称
        System.out.println("类名(getName):"+data.getName());

        /**
         * Method类,一个成员方法就是一个Method对象实例。方法也是对象
         * getDeclaredMethods(); 返回所有方法,但是不包括继承的方法
         * getmethods() 返回继承的方法和自己定义的public方法
         */
        Method [] methods = data.getMethods();
        for(Method temp : methods){
            // 获得返回值类型
            Class returnType = temp.getReturnType();
            System.out.print(returnType.getSimpleName()+" ");
            // 获得方法名
            System.out.print(temp.getName()+"(");
            // 获得参数数组
            Class [] params = temp.getParameterTypes();
            for(Class param : params){
                System.out.print(param.getSimpleName()+",");
            }
            System.out.println(")");
        }
    }

测试类:

    public static void main(String[] args) {
        ClassUtil.printClassMethodMessage("bbb");
    }

结果是:

类名(getName):java.lang.String
boolean equals(Object,)
String toString()
int hashCode()
int compareTo(String,)
int compareTo(Object,)
int indexOf(String,int,)
int indexOf(String,)
int indexOf(int,int,)
int indexOf(int,)
String valueOf(int,)
String valueOf(long,)
String valueOf(float,)
String valueOf(boolean,)
String valueOf(char[],)
String valueOf(char[],int,int,)
String valueOf(Object,)
String valueOf(char,)
String valueOf(double,)
...

获得成员变量的信息

Field对象表示成员变量。每一个变量都是一个Field对象
- getFields() 获得public变量。返回Field[]
- getDeclaredFields() 获得所有变量,但不包括继承的变量 。返回Field[]
- getType获得 变量的类型。返回Class

    public static void printClassFieldMessage(Object obj){
        Class data = obj.getClass();
        // 获得所有成员变量
        Field []  fields = data.getDeclaredFields();
        for(Field field:fields){
            System.out.println(field.getType().getName() +" ");
            System.out.println(field.getName());
        }
    }

结果是:

    [C 
    value
    int 
    hash
    long 
    serialVersionUID
    [Ljava.io.ObjectStreamField; 
    serialPersistentFields
    java.util.Comparator 
    CASE_INSENSITIVE_ORDER

获得构造方法

Constructor类的实例化对象,表示构造函数

获得构造函数:

    public static void printClassConFieldMessage(Object obj){
        Class data = obj.getClass();
        // 获得所有的构造函数
        Constructor[] cons = data.getConstructors();
        for(Constructor con:cons){
            // 获得函数名
            System.out.print(con.getName()+"(");
            // 获得参数列表
            Class [] params = con.getParameterTypes();
            for(Class param : params){
                System.out.print(param.getName()+",");
            }
            System.out.println(")");
        }
    }

结果:

    java.lang.String([B,int,int,)
    java.lang.String([B,java.nio.charset.Charset,)
    java.lang.String([B,java.lang.String,)
    java.lang.String([B,int,int,java.nio.charset.Charset,)
    java.lang.String([B,int,int,java.lang.String,)
    java.lang.String(java.lang.StringBuilder,)
    java.lang.String(java.lang.StringBuffer,)
    java.lang.String([B,)
    java.lang.String([I,int,int,)
    java.lang.String()
    java.lang.String([C,)
    java.lang.String(java.lang.String,)
    java.lang.String([C,int,int,)
    java.lang.String([B,int,)
    java.lang.String([B,int,int,int,)
相关文章
|
8月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1047 157
|
8月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
519 18
|
9月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
269 11
|
8月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
356 4
|
8月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
483 5
【Java】— —实现人物对象的增、删、改、查(注:对象的删除以逻辑删除为主,在person类中设置“删除状态字段”,字删除该字段时,将状态改为有效。)
【Java】— —实现人物对象的增、删、改、查(注:对象的删除以逻辑删除为主,在person类中设置“删除状态字段”,字删除该字段时,将状态改为有效。)
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
292 19
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
170 10
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
195 4
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。