Java反射简介

Java反射简介

1.Class类
1) 在面向对象的世界里,万事万物皆对象。(java语言中,静态的成员、普通数据类型除外)
类是不是对象呢?类是(哪个类的对象呢?)谁的对象呢?
类是对象,类是java.lang.Class类的实例对象
2)这个对象到底如何表示
3 )Class.forName("类的全称")
不仅表示了,类的类类型,还代表了动态加载类
请大家区分编译、运行
编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
4)基本的数据类型
void关键字 都存在类类型
5)Class类的基本API操作

2.方法的反射
1)如何获取某个方法
方法的名称和方法的参数列表才能唯一决定某个方法
2)方法反射的操作
method.invoke(对象,参数列表)
3)为什么要用方法的反射
why?指定方法名称调用方法
举个实际应用的案例 ---->通过标准JavaBean的属性名获取其属性值
BeanUtil类
4)通过Class,Method来认识泛型的本质

 1 package com.imooc.reflect;
 2
 3 public class ClassDemo1 {
 4     public static void main(String[] args) {
 5         //Foo的实例对象如何表示
 6         Foo foo1 = new Foo();//foo1就表示出来了.
 7         //Foo这个类 也是一个实例对象,Class类的实例对象,如何表示呢
 8         //任何一个类都是Class的实例对象,这个实例对象有三种表示方式
 9
10         //第一种表示方式--->实际在告诉我们任何一个类都有一个隐含的静态成员变量class
11         Class c1 = Foo.class;
12
13         //第二中表达方式  已经知道该类的对象通过getClass方法
14         Class c2 = foo1.getClass();
15
16         /*官网 c1 ,c2 表示了Foo类的类类型(class type)
17          * 万事万物皆对象,
18          * 类也是对象,是Class类的实例对象
19          * 这个对象我们称为该类的类类型
20          *
21          */
22
23         //不管c1  or c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
24         System.out.println(c1 == c2);
25
26         //第三种表达方式
27         Class c3 = null;
28         try {
29             c3 = Class.forName("com.imooc.reflect.Foo");
30         } catch (ClassNotFoundException e) {
31             // TODO Auto-generated catch block
32             e.printStackTrace();
33         }
34         System.out.println(c2==c3);
35
36         //我们完全可以通过类的类类型创建该类的对象实例---->通过c1 or c2 or c3创建Foo的实例对象
37         try {
38             Foo foo = (Foo)c1.newInstance();//需要有无参数的构造方法
39             foo.print();
40         } catch (InstantiationException e) {
41             // TODO Auto-generated catch block
42             e.printStackTrace();
43         } catch (IllegalAccessException e) {
44             // TODO Auto-generated catch block
45             e.printStackTrace();
46         }
47
48
49     }
50 }
51 class Foo{
52
53     void print(){
54         System.out.println("foo");
55     }
56 }

通过字节码拿到类的名称

 1 package com.imooc.reflect;
 2
 3 public class ClassDemo2 {
 4     public static void main(String[] args) {
 5
 6         Class c1 = int.class;//int 的类类型
 7         Class c2 = String.class;//String类的类类型   String类字节码(自己发明的)
 8         Class c3 = double.class;
 9         Class c4 = Double.class;
10         Class c5 = void.class;
11
12         System.out.println(c1.getName());
13         System.out.println(c2.getName());
14         System.out.println(c2.getSimpleName());//不包含包名的类的名称
15         System.out.println(c5.getName());
16     }
17
18 }

通过字节码文件打印类的属性和方法

 1 package com.imooc.reflect;
 2
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.Method;
 6
 7 public class ClassUtil {
 8     /**
 9      * 打印类的信息,包括类的成员函数、成员变量(只获取成员函数)
10      * @param obj 该对象所属类的信息
11      */
12     public static void printClassMethodMessage(Object obj){
13         //要获取类的信息  首先要获取类的类类型
14         Class c = obj.getClass();//传递的是哪个子类的对象  c就是该子类的类类型
15         //获取类的名称
16         System.out.println("类的名称是:"+c.getName());
17         /*
18          * Method类,方法对象
19          * 一个成员方法就是一个Method对象
20          * getMethods()方法获取的是所有的public的函数,包括父类继承而来的
21          * getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
22          */
23         Method[] ms = c.getMethods();//c.getDeclaredMethods()
24         for(int i = 0; i < ms.length;i++){
25             //得到方法的返回值类型的类类型
26             Class returnType = ms[i].getReturnType();
27             System.out.print(returnType.getName()+" ");
28             //得到方法的名称
29             System.out.print(ms[i].getName()+"(");
30             //获取参数类型--->得到的是参数列表的类型的类类型
31             Class[] paramTypes = ms[i].getParameterTypes();
32             for (Class class1 : paramTypes) {
33                 System.out.print(class1.getName()+",");
34             }
35             System.out.println(")");
36         }
37     }
38     /**
39      * 获取成员变量的信息
40      * @param obj
41      */
42     public static void printFieldMessage(Object obj) {
43         Class c = obj.getClass();
44         /*
45          * 成员变量也是对象
46          * java.lang.reflect.Field
47          * Field类封装了关于成员变量的操作
48          * getFields()方法获取的是所有的public的成员变量的信息
49          * getDeclaredFields获取的是该类自己声明的成员变量的信息
50          */
51         //Field[] fs = c.getFields();
52         Field[] fs = c.getDeclaredFields();
53         for (Field field : fs) {
54             //得到成员变量的类型的类类型
55             Class fieldType = field.getType();
56             String typeName = fieldType.getName();
57             //得到成员变量的名称
58             String fieldName = field.getName();
59             System.out.println(typeName+" "+fieldName);
60         }
61     }
62     /**
63      * 打印对象的构造函数的信息
64      * @param obj
65      */
66     public static void printConMessage(Object obj){
67         Class c = obj.getClass();
68         /*
69          * 构造函数也是对象
70          * java.lang. Constructor中封装了构造函数的信息
71          * getConstructors获取所有的public的构造函数
72          * getDeclaredConstructors得到所有的构造函数
73          */
74         //Constructor[] cs = c.getConstructors();
75         Constructor[] cs = c.getDeclaredConstructors();
76         for (Constructor constructor : cs) {
77             System.out.print(constructor.getName()+"(");
78             //获取构造函数的参数列表--->得到的是参数列表的类类型
79             Class[] paramTypes = constructor.getParameterTypes();
80             for (Class class1 : paramTypes) {
81                 System.out.print(class1.getName()+",");
82             }
83             System.out.println(")");
84         }
85     }
86 }
时间: 2024-10-07 10:36:20

Java反射简介的相关文章

java反射机制简介

1.字节码.所谓的字节码就是当java虚拟机加载某个类的对象时,首先需要将硬盘中该类的源代码编译成class文件的二进制代码(字节码),然后将class文件的字节码加载到内存中,之后再创建该类的对象 2.java反射的基础是Class类(注意不是小写的class),Class类实例代表着内存中的一份字节码.常见的获取Class类对象的方法如下(第一种为对象的方法,第二种为类的方法): Dog dog = new Dog(); Class dogClass = dog.getClass(); Cl

工厂类分离与java反射机制

网易 博客 发现 小组 风格 手机博客 玩LOFTER,免费冲印20张照片!> 创建博客登录 加关注 黙言-在路上 奋斗 首页 日志 相册 音乐 收藏 博友 关于我 黙言 加博友   关注他 他的网易微博 最新日志 Javascript 操作select控件 Oracle 存储过程基本语法 将域名和tomcat6进行绑定的 svn 423 Locked JS的trim()方法 jbpm4.4 结束流程时报错 随机阅读 让员工每年有一次机会当主角 外国女性如何舍身"套"色狼 亚洲电

Java 反射机制(一)

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

Java反射学习一

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

转!!java反射机制

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

java反射机制剖析(二)— Class Loader

上一篇博客简要的提了一下java反射机制中涉及到的一些相关知识,那么ClassLoader就是其中之一.本篇博客就详细的对ClassLoader做一个相对深入的了解.作为了解需要知道的是,其实类类型(Class Class)是和ClassLoader分不开的,因为ClassLoader需要的信息是由它提供的.类类型将在下一篇博客介绍. 简介 ClassLoader是负责加载类的对象,作用是根据Jvm请求提供的类信息,将请求的类加载的内存中或者说加载到Jvm中.另外,每一个类的Class对象(注意

浅说Java反射机制

工作中遇到,问题解决: JAVA语言中的反射机制: 在Java 运行时 环境中,对于任意一个类,能否知道这个类有哪些属性和方法? 对于任意一个对象,能否调用他的方法?这些答案是肯定的,这种动态获取类的信息,以及动态调用类的方法的功能来源于JAVA的反射.从而使java具有动态语言的特性. JAVA反射机制主要提供了以下功能: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法) 4.在运

Java反射机制学习笔记

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

Java反射(Reflection)

基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的反射(Reflection)机制. Java反射机制主要提供了以下功能: 1.在运行时判断任意一个对象所属的类. 2.在运行时构造任意一个类的对象. 3.在运行时判断任意一个类所具有的成员变量和方法. 4.在运行时调用任意一个对象的方法. 5.在运行时设定任意一个对象的属性值. Refl