Java 反射获取类详细信息的常用方法总结

类ReflectionDemo


代码如下:

package Reflection;

@Deprecated
public class ReflectionDemo {
    private String pri_field;
    public String pub_field;
    public ReflectionDemo(){}
    public ReflectionDemo(String name){}
    private ReflectionDemo(String name,int int1){}
    public void ReflectMethod(){}
    public void ReflectMethod(String str){}
    private void ReflectMethod(int int1){}
    class innerclss_Relfection{}

}

测试类ReflectionDemoTest

代码如下:

package Reflection;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionDemoTest {
    public static void main(String[] args) {
        //创建类对象,使用泛型修饰避免强转
        Class cla=ReflectionDemo.class;
        //获取全部公共域的方法
        Field[] field=cla.getFields();
        for(Field f:field){
            System.out.println("获取全部公共域的方法:"+f.toString());
        }
        //获取指定的某公共域的方法
        try {
            Field field1=cla.getField("pub_field");
            System.out.println("获取指定的公共域的方法:"+field1.toString());
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //获取全部域的方法(含私有域),Declare
        Field[] field2=cla.getDeclaredFields();
        for(Field f:field2){
            System.out.println("获取全部域的方法(含私有域):"+f.toString());
        }
        //获取指定域的方法(含私有域)
        try {
            Field field3=cla.getDeclaredField("pri_field");
            System.out.println("获取指定域的方法(含私有域):"+field3.toString());
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

//获取全部公共方法的方法(含父类)
        Method[] method=cla.getMethods();
        for(Method m:method){
            System.out.println("获取全部公共方法的方法:"+m.toString());
        }
        try {
            //获取指定无参方法
            //第二个参数表示参数类型,参数NUll表示无参数方法
            Method method1=cla.getMethod("ReflectMethod", null);
            System.out.println("获取无参公共方法的方法:"+method1.toString());
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

//获取该类全部方法的方法(不含父类)
        Method[] method2=cla.getDeclaredMethods();
        for(Method m:method2){
            System.out.println("获取全部方法的方法(含父类):"+m.toString());
        }

//获取该类指定方法的方法(不含父类)
        //第一个参数为方法名,第二个参数为方法返回类型,NULL则为无参方法
        try {
            Method method3=cla.getDeclaredMethod("ReflectMethod",int.class);
            System.out.println("获取该类指定方法的方法(不含父类):"+method3);
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

//获取公有构造方法
        //获取无参公有构造方法
        try {
            Constructor cs=cla.getConstructor(null);
            System.out.println("获取无参构造方法:"+cs);
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

//获取有参公有构造方法
        //如多个参数的构造方法,则构造方法为多个,注意顺序
        try {
            Constructor cs=cla.getConstructor(String.class);
            System.out.println("获取有参构造方法:"+cs);
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

//获取全部构造方法

try {
            Constructor[] cs=cla.getDeclaredConstructors();
            for(Constructor c:cs){
            System.out.println("获取全部构造方法:"+c);
            }
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

}
        //获取包名
        Package pack=cla.getPackage();
        System.out.println("获取当前包的名称:"+pack);

//获取注释
        Annotation[] ann=cla.getAnnotations();
        for(Annotation an:ann){
            System.out.println(an.toString());
        }

//获取父类
  Class supercla=cla.getSuperclass();
  System.out.println(supercla);
  //获取内部类
  Class[] innercla=cla.getDeclaredClasses();
  for(Class cl:innercla){
   System.out.println(cl);

}

}
}

总结:获取Class对象的信息方式的步骤:

1.创建Class对象 方法1 Class cla=Class.forName(“PATH”)方法2 CLass cla=实例.getclass(); 方法3 Class cla=类.class

2.使用Field(域),Method(方法),Constructor(构造方法),Package(包),Annotation(注释),通过调用cla.getXXXX方法来获取相关信息

3.获取父类以及内部类的方式略有不同

4.当使用cla.getMethods的时候调用的是该类以及该父类的全部公有方法

5.当使用Declared调用的是该类的全部方法包含私有方法,在域,构造方法中同样适用

6.当反射类无公有构造方法时无法直接使用newInstance方法,则使用

Method cs=cla.getMethod("getInstance",null);//获取方法
         Calendar calendar=(Calendar) cs.invoke(cla, null);//执行获取的方法,参数1为执行方法的对象,参数2表示该方法的参数
         Date df=calendar.getTime();
         System.out.println(df.toString());

来获取。

(0)

相关推荐

  • java反射之获取类的信息方法(推荐)

    本文接上文"老生常谈反射之Class类的使用(必看篇)",以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获取成员函数信息 /** * 获取成员函数信息 * @param obj */ public static void printClassMethodMessage(Object obj){ //获取类的信息 获取类的类类型 Class c = obj.getClass(); //获取类的名称 System.o

  • Java 反射获取类详细信息的常用方法总结

    类ReflectionDemo 复制代码 代码如下: package Reflection; @Deprecated public class ReflectionDemo {     private String pri_field;     public String pub_field;     public ReflectionDemo(){}     public ReflectionDemo(String name){}     private ReflectionDemo(Stri

  • Java反射获取实例的速度对比分析

    之前代码有一个逻辑,是在初始化时读取某个包下的所有class文件,放入到一个HashMap里.代码运行过程中,通过Key获取到对应class的全路径名,最后通过Class.forName(className).getDeclaredConstructor().newInstance()获取实例对象. 后来同事看到了代码,对这个HashMap里存储方式提出了建议,之前的Map是<String,String>完全可以改成<String,Class> 后来我测试了一下两者实例化一个对象的

  • Java反射(Class类,Class对象获取)

    目录 Java反射超详解 1.反射基础 1.1Class类 1.2类加载 2.反射的使用 2.1Class对象的获取 2.2Constructor类及其用法 2.3Field类及其用法 Java反射超详解 1.反射基础 Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法:对于任意一个对象,都能够知道它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制. Java反射机制主要提供以下这几个功能: 在运行时判断任意一个对象所属的类

  • Java通过反射查看类的信息示例

    本文实例讲述了Java通过反射查看类的信息.分享给大家供大家参考,具体如下: 一 点睛 1 通过反射获取Class对象 使用Class类的forName()静态方法.该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名(必须添加完整包名). 调用某个类的class属性来获取该类对应的Class对象.例如Person.class将会返回Person类对应的Class对象. 调用某个对象的getClass()方法,该方法是java.lang.Object类中的一个方法,所以所有Java对象

  • Java反射使用的详细介绍(最新推荐)

    目录 反射 反射基本介绍 反射获取类对象 反射获取构造器对象 反射获取成员变量对象 反射获取方法对象 反射 反射基本介绍 反射概述: 反射认为类的每一个成份都是一个对象, 对于任何一个Class类,在"运行的时候"都可以直接得到这个类全部成分. 在运行时,可以直接得到这个类的构造器对象:Constructor 在运行时,可以直接得到这个类的成员变量对象:Field 在运行时,可以直接得到这个类的成员方法对象:Method 这种运行时动态获取类信息以及动态调用类中成分的能力称为Java语

  • Java中ArrayList类详细介绍

    Java中ArrayList类详细介绍 ArrayList是一个可变长度数组,它实现了List接口,因此它也可以包含重复元素和Null元素,也可以任意的访问和修改元素,随着向 ArrayList 中不断添加元素,其容量也自动增长.不过ArrayList是非同步(同步的意思是如果多个线程同时访问一个实例,任何一个线程对实例做了修改之后,其他线程所访问到的实例应该是修改过的最新的实例)的, 我们经常使用List list = Collections.synchronizedList(new Arra

  • Java反射 PropertyDescriptor类案例详解

    JAVA中反射机制(JavaBean的内省与BeanUtils库) 内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为"值对象"(Value Object),或"VO".方法比较少.这些信息储存在类的私有变量中,通过set(

  • Java反射及性能详细

    目录 一.准备 二.反射调用流程 1.反射的使用 2.getMethod 和 getDeclaredMethod区别 三.调用反射方法 四.反射效率低的原因 五.反射优化 我们今天不探讨框架层面的内容,暂且认为90%的框架不存在无法容忍的性能问题.在做系统调优的过程中,面对随处可见的invoke调用,我的内心其实是比较抵触的,倒不是说反射怎么不好,对于优雅的源码来说,反射必不可少,个人抵触的原因主要是因为反射把真实的方法"隐藏"的很好,面对长长的线程栈比较头大而已.而且我心里一直有个大

  • asp.net实现获取客户端详细信息

    本文实例讲述了asp.net实现获取客户端详细信息代码.分享给大家供大家参考.具体如下: 运行效果截图如下: 具体代码如下: 其中aspx页面的控件代码: 复制代码 代码如下: <asp:ListBox runat="server" ID="lbHoverTreeInfo" ClientIDMode="Static"> </asp:ListBox> 以下是实现代码: using System; using System.W

随机推荐