java反射的学习

1.类的 类类型(ClassType)

类的类类型可以用来做很多事,我们可以通过它获取到类的名称,类的路径,类的成员变量,类的方法等等,还可以通过它获得类的实例化对象。

我们可以通过 类名.class 来得到类的类类型,如下面的 c1

Class c1 = ReflectDemo.class;

我们可以通过类的实例对象得到类的类类型

ReflectDemo demo1 = new ReflectDemo();
Class c2 = demo1.getClass();

还可以通过类的包路径加类名获得类的类类型

Class c3 = Class.forName("reflectdemo.ReflectDemo");

值得注意的是,每个类只有一个类类型,也就是说上面的 c1, c2 , c3 指向的是同一个对象。

在开头也说了,类的类类型同样可以得到类的实例,所以两者可以相互得到。

类自身,类的类类型 和 类的实例对象 的关系如下图:

2.通过类的类类型获取类的成员变量以及方法

自己写了一个方法,通过传入某个类的实例对象,就能得到该类的方法。

其中 getMethod() 方法是获取类中所有public方法,包括父类的 public 方法;getDeclareMethod()方法可以获取本类中声明的所有方法,不论权限

    public static void getClassMethods(Object obj){
        Class c = obj.getClass();     //获取类类型
        Method []ms = c.getMethods();  //获取类中所有的public方法,包括父类中的方法
        Method []ms2 = c.getDeclaredMethods();  ////获取该类自己声明的所有方法,不论权限
        Field []fields = c.getFields();   //获取类中public级成员变量
        for(Field f:fields){
            String fieldType = f.getType().getSimpleName();   //获得成员变量类型
            String fieldName = f.getName();    //获得成员变量名
            System.out.println(fieldType+" "+fieldName);
        }

        for(Method m:ms){
            String type = m.getReturnType().getName();   //方法的返回值类型
            System.out.print(type+" ");
            String methodName=m.getName();        //方法名
            System.out.print(methodName+"(");
            Class []params = m.getParameterTypes();   //方法中 参数的类类型 元组

            for(Class param:params){
                String parName = param.getName();   //从参数类类型中得到参数名
                System.out.print(parName+" ");
            }
            System.out.println(");");
        }

    }

 3.通过反射来操作方法

除了上面通过getMethods()和getDeclaredMethods()获取方法数组之外,还可以通过getMethod()和getDeclaredMethod()来对单个方法进行查找。

这时就要注意,想要定位一个方法,必须要传入正确的方法名以及参数类类型才行。如下:

public class ReflectDemo2 {

    public void print(){
        System.out.println("a+b");
    }

    public String add(String a,String b){
        return a+b;
    }

    public int add(int a,int b){
        return a+b;
    }
}

我们想要获取对应的方法就要进行如下操作:

        ReflectDemo2 demo=new ReflectDemo2();
        Class c=ReflectDemo2.class;
        try {
            //通过传入的方法名称和参数类类型来获得某一确定方法的类类型
//            Method m1=c.getMethod("add", new Class[]{int.class,int.class});  //第一个参数为方法名,后面既可以传入一个类类型数组,也可以单独地传入类类型
            Method m1=c.getMethod("add",int.class,int.class);
            Object obj = m1.invoke(demo, 10,20);   //通过invoke()来执行方法,要传入类的实例对象以及对应参数的值
            System.out.println(obj);

            Method m2=c.getMethod("print");   //如果没有参数要传入,直接输入方法名即可
            m2.invoke(demo);   //如果方法没有返回值,可以不用获取
            } catch (Exception e) {
                e.printStackTrace();
            }

    }

结果和平常使用类的实例对象调用方法的结果是一样的。

待编辑。。

时间: 2024-10-28 15:24:24

java反射的学习的相关文章

JAVA反射机制—学习总结

最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象. 什么是反射机制? "JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制."我们通过一些例子,更好理解反射机制.Class类 我们知道Java是一门面向对象

Java反射技术学习总结

-------<a href="http://www.itheima.com/"">android培训</a>.<a href="http://www.itheima.com/" ">java培训</a>期待与您交流!---------- Java反射技术就是将java中的类的各个组成部分反射出来变为java中相应的数据类型获得. Java同样将类中的各个组成部分进行封装,变为一个个Java类. C

Java反射再学习

在最初学习Java的时候觉得反射真的好难,并不是技术负责,而是思想复杂,无法接受.随着工作经验的增多,今日偶然间又看见某智的一个视频,感觉茅塞顿开.顺便在此系统整理一下反射的知识. 一言以蔽之:反射就是将Java类的各个组成部分转换为对应的Java对象. 我们知道,一切皆对象,那么这个“一切”必然也包含了Java类啊,Java类也是一种事物,那么他是什么的对象呢?毫无疑问,Java类是Class类的对象.(PS:那么Class类又是谁的对象呢?求大神指教?这问题貌似无穷无尽啊 %>_<% )

Java 反射机制学习资料

Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方法 Java反射——注解 Java反射——泛型 Java反射——数组 Java反射——动态代理 Java反射——类的动态加载和重新加载

JAVA反射机制学习随笔

JAVA反射机制是用于在运行时动态的获取类的信息或者方法,属性,也可以用来动态的生成类,由于所有类都是CLASS的子类,我们可以用一个CLASS类的实例来实例化各种类 例如: Class<?> class1 = null; Class<?> class2 = null; //写法1, 可能抛出 ClassNotFoundException [多用这个写法] class1 = Class.forName("cn.lee.demo.Person"); System.

Java反射机制学习

Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一个类的对象. 在运行时判断任意一个类所具有的成员变量和方法. 在运行时调用任意一个对象的

java反射机制学习笔记及例子代码

Java 反射的API 反射中常常用的几个类如下所示: java.lang 包中: --Class 类:代表一个类 Java 中,无论生成某个类的多少个对象,这些对象都会对应同一个 Class 对象 Java.lang.reflect 包中: --Field 类:代表类的成员变量(类的属性) --Method 类:代表类的方法,一个方法对应一个 Method 对象 --Constructor 类:代表类的构造方法 --Array 类:提供动态创建数组,以及访问数组的元素的静态方法 利用反射机制调

Java反射机制学习笔记

Java反射机制 简介 通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理可以原生实现AOP中的方法拦截功能.通过反射获取到的Java类内部结构后再进行运用,和直接运用这个类效果相同,但额外的提供了运行时刻的灵活性.反射的最大一个弊端是性能比较差.相同的操作,用反射API所需的时间大概比直接的使用要慢一两个数量级.可以考虑在适当的时机来使用反射API. 基本用法 Java反射机制主要有两个作用.第一个主要作用是获取程序再运行时刻的内部结构.只需要少量的代码就能便利出一个J

java反射机制学习小结

之前一直对java的反射机制理解得很模糊,今天因为学习spring,所以花了些时间总算把它理顺了,记录一下 另外,推荐读读这篇文章,写的挺好的http://blog.csdn.net/woshixuye/article/details/7700455 class Person { private String name; private int age; // public Person(String name,int age){ // this.name=name; // this.age=a

java反射机制学习:初始反射机制

本人小白一枚,想和大家一起分享我学习java的笔记和心得. 反射机制: 指的是可以于运行时加载.探知.使用编译期间完全未知的类. 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: Class clazz = Class.forName(com.danchel.reflect.User); 加载完类之后,在堆内存中,就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象