转载请标明出处:

http://blog.csdn.net/forezp/article/details/53730429

本文出自方志朋的博客

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【翻译于 官方文档】

本篇将从以下几个方面讲述反射的知识:

  • calss的使用
  • 方法的反射
  • 构造函数的反射
  • 成员变量的反射

一、什么是class类

在面向对象的世界里,万物皆对象。类是对象,类是java.lang.Class类的实例对象。另外class类只有java虚拟机才能new出来。任何一个类都是Class 类的实例对象。这实例对象有三种表达方式:

public class User{
} public class ClassTest{
User u=new User();
//方式1:
Class c1=User.class;
//方式2:
Class c2=u.getClass();
//方式3:
Class c3=Class.forName("com.forezp.User"); //可以通过类的类型创建该类的实例对象
User user=(User)c1.newInstance();
}

二、class类的动态加载

Class.forName(类的全称);该方法不仅表示了类的类型,还代表了动态加载类。编译时刻加载类是静态加载、运行时刻加载类是动态加载类。

三、获取方法信息

基本的数据类型,void关键字都Class 类的实例;可以通过get

ame();getSimpleName()获取类的名称。

Class c1=String.class;
Class c2=int.class;
Class c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName());

获取类的所有方法,并打印出来:

public static void printClassInfo(Object object){
Class c=object.getClass();
System.out.println("类的名称:"+c.getName()); /**
* 一个成员方法就是一个method对象
* getMethod()所有的 public方法,包括父类继承的 public
* getDeclaredMethods()获取该类所有的方法,包括private ,但不包括继承的方法。
*/
Method[] methods=c.getMethods();//获取方法
//获取所以的方法,包括private ,c.getDeclaredMethods(); for(int i=0;i<methods.length;i++){
//得到方法的返回类型
Class returnType=methods[i].getReturnType();
System.out.print(returnType.getName());
//得到方法名:
System.out.print(methods[i].getName()+"("); Class[] parameterTypes=methods[i].getParameterTypes();
for(Class class1:parameterTypes){
System.out.print(class1.getName()+",");
}
System.out.println(")");
}
}
public class ReflectTest {

        public static void main(String[] args){
String s="ss";
ClassUtil.printClassInfo(s);
}
}

运行:

类的名称:java.lang.String

booleanequals(java.lang.Object,)

java.lang.StringtoString()

inthashCode()

四、获取成员变量的信息

也可以获取类的成员变量信息


public static void printFiledInfo(Object o){ Class c=o.getClass();
/**
* getFileds()获取public
* getDeclaredFields()获取所有
*/
Field[] fileds=c.getDeclaredFields(); for(Field f:fileds){
//获取成员变量的类型
Class filedType=f.getType();
System.out.println(filedType.getName()+" "+f.getName());
} }
 public static void main(String[] args){
String s="ss";
//ClassUtil.printClassInfo(s);
ClassUtil.printFiledInfo(s);
}

运行:

[C value

int hash

long serialVersionUID

[Ljava.io.ObjectStreamField; serialPersistentFields

java.util.Comparator CASE_INSENSITIVE_ORDER

int HASHING_SEED

int hash32

五、获取构造函数的信息

public static void printConstructInfo(Object o){
Class c=o.getClass(); Constructor[] constructors=c.getDeclaredConstructors();
for (Constructor con:constructors){
System.out.print(con.getName()+"("); Class[] typeParas=con.getParameterTypes();
for (Class class1:typeParas){
System.out.print(class1.getName()+" ,");
}
System.out.println(")");
}
}
 public static void main(String[] args){
String s="ss";
//ClassUtil.printClassInfo(s);
//ClassUtil.printFiledInfo(s);
ClassUtil.printConstructInfo(s);
}

运行:

java.lang.String([B ,)

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(int ,int ,[C ,)

java.lang.String([C ,boolean ,)

java.lang.String(java.lang.StringBuilder ,)

java.lang.String(java.lang.StringBuffer ,)

六、方法反射的操作

获取一个方法:需要获取方法的名称和方法的参数才能决定一个方法。

方法的反射操作:

method.invoke(对象,参数列表);

举个例子:

class A{

    public void add(int a,int b){
System.out.print(a+b);
} public void toUpper(String a){
System.out.print(a.toUpperCase());
}
}
 public static void main(String[] args) {
A a=new A();
Class c=a.getClass();
try {
Method method=c.getMethod("add",new Class[]{int.class,int.class});
//也可以 Method method=c.getMethod("add",int.class,int.class);
//方法的反射操作
method.invoke(a,10,10);
}catch (Exception e){
e.printStackTrace();
}
}

运行:

20

本篇文章已经讲解了java反射的基本用法, 它可以在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

优秀文章推荐:




扫码关注公众号有惊喜

(转载本站文章请注明作者和出处 方志朋的博客

关于Java的反射机制,你需要理解这些..的更多相关文章

  1. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  2. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  3. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  4. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

  5. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  6. 【转】java原理—反射机制

    一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言 ...

  7. java原理—反射机制

    http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html 一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程 ...

  8. Java的反射机制和动态代理

    介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原 ...

  9. 学习:java原理—反射机制

      一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究.它首先被程 ...

  10. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

随机推荐

  1. pandas DataFrame数据转为list

    dfpath=df[df['mm'].str.contains('20180122\d')].values dfplist=np.array(dfpath).tolist()

  2. [转]js 判断图片存在

    转自:http://blog.csdn.net/qq415734794/article/details/7261479 .//检查图片是否存在 .function CheckImgExists(img ...

  3. checkBox 全选、全不选、反选

    checkBox的使用: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...

  4. EF框架

    Linq to EF 添加: //用户注册int IUserDAO.Register(Users user) { ; using (EF.ddgwDBEntities context = new EF ...

  5. .Net程序员学习Linux最简单的方法(转载)

    有很多关于Linux的书籍.博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...

  6. python面试题——框架和其他(132题)

    一.框架对比 (1)django.flask.tornado框架的比较? Django:简单的说Django是一个大而全的Web框架,内置了很多组件,ORM.admin.Form. ModelForm ...

  7. 浏览器警告:provisional headers are shown

    做项目的时候遇到一个问题 后台JAVA,每次发送的都有一次拦截,去转发到登录页面的url 有一个请求是https的,被拦截后显示发生了错误,浏览器警告:provisional headers are ...

  8. canvas实例(基础)

    JS实现五子棋大战:GitHub源码 知识点总结: 第一步.基础: //获取canvas var chess = document.getElementById('chess'); //获取上下文,创 ...

  9. C++ Knowledge series Inheritance & RTTI & Exception Handling

    Inheritance The pointer or reference to base class can address/be assigned with any of the classes d ...

  10. Cg shadow of sphere

    参考自:https://en.wikibooks.org/wiki/GLSL_Programming/Unity/Soft_Shadows_of_Spheres using UnityEngine; ...