原文:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

个人总结:

1. 反射是什么:由字节码文件(.class)获取类文件(.java)相关信息的操作叫做反射。

2. 获取class文件的三种方式

<1> Class.forName("Reflect.Person") ;

<2> Person.class;

<3> new Person().getClass();

3. class 的api

<1> 取得全部的构造函数 

  Constructor<?> cons = demo.getConstructor();

  带参数的构造使用 Constructor<?> cons = demo.getConstructor(String.class)

  可以由此获取一个实例 Person per1 = (Person)cons.newInstance();

<2> 取得该类实现的所有接口

  Class<?> intes[] = demo.getInterfaces();
  for (int i = 0; i < intes.length; i++) {
    System.out.println("实现的接口 "+intes[i].getName());
  }

<3> 取得该类的父类

  Class superClass = demo.getSuperClass();

<4> 获取方法的修饰符(private public protected)(以构造方法为例)

  Class<?> clazz = Class.forName("Package.Demo");

  Construction cosn = clazz.getConstruction(String.class);  //获取参数类型为String的构造函数

  int mo = cosn.getModifies();  //得到的是一个int值

  String priv = Modifier.toString(mo);  //通过此方法可以获取当前方法的修饰符

<5> 获取方法的参数类型

  Class<?> ps[] = cosn.getParameterTypes();  //获取构造函数的参数数组

  ps[i].getName();  //可以得到该构造函数的参数类型 必然是String了

<6> 获取类中所有的方法

  Method methods[] = clazz.getMethods();  //获取当前类中的所有的方法

<7> 获取方法的返回值类型

  Class<?> mclazz = method[i].getReturnType();  

  mclazz.getName();  //获得该方法返回值的类型

<8> 获取属性

  Field fields[] = clazz.getDeclaredFields();  //获取全部的属性 包括private protected

  Field fields[] = clazz.getFields();  //获取所有的public属性

<9> 获取属性的修饰符 属性的类型 属性的名称

  field[i].getModifier();  //private public.....
  field[i].getType().getName();  //String Integer .....

  field[i].getName();  //sex age and so on.....

<10> 调用类中的方法

  Class<?> clazz = Class.forName("Package.Demo");

  Method method = clazz.getMethod("sayHello");  //通过方法名称获取方法

  method.invoke(clazz.newInstance());  //此为不带参数的方法调用

  Method method = clazz.getMethod("sayHello',String.class,int.class);  //通过方法名称获取带参数的方法

  method.invoke(clazz.newInstance(),"pikzas",20);  //带参方法的调用

<11> 调用类的get set方法

class hello {
    public static void main(String[] args) {
        Class<?> demo = null;
        Object obj=null;
        try {
            demo = Class.forName("Reflect.Person");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try{
         obj=demo.newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        setter(obj,"Sex","男",String.class);
        getter(obj,"Sex");
    }

    /**
     * @param obj
     *            操作的对象
     * @param att
     *            操作的属性
     * */
    public static void getter(Object obj, String att) {
        try {
            Method method = obj.getClass().getMethod("get" + att);
            System.out.println(method.invoke(obj));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param obj
     *            操作的对象
     * @param att
     *            操作的属性
     * @param value
     *            设置的值
     * @param type
     *            参数的属性
     * */
    public static void setter(Object obj, String att, Object value,
            Class<?> type) {
        try {
            Method method = obj.getClass().getMethod("set" + att, type);
            method.invoke(obj, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}// end class

JAVA-反射学习的更多相关文章

  1. Java反射学习系列-绪论

    Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924

  2. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...

  3. Java反射学习总结四(动态代理使用实例和内部原理解析)

    通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...

  4. Java 反射学习笔记

    要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...

  5. Java反射学习:深入学习Java反射机制

    一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射学习笔记

    1.java反射概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功 ...

  9. Java反射学习(java reflect)(二)

    ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareFi ...

  10. JAVA反射学习网摘

    程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动 ...

随机推荐

  1. C++之Effective STL

    今天看了下websocket的知识,了解到这是html5新增的特性,主要用于实时web的通信.之前客户端获取服务端的数据,是通过客户端发出请求,服务端进行响应的模式,或者通过ajax每隔一段时间从后台 ...

  2. NuGet的本地服务器安装与Package的发布

    NuGet的本地服务器安装与Package的发布 主要的步骤是按照下面的例子来做的: NuGet学习笔记(1)——初识NuGet及快速安装使用 NuGet学习笔记(2)——使用图形化界面打包自己的类库 ...

  3. Oracle和Mysql分别生成sequence序列

    有时候在往数据库中插入数据的时候,如果ID值是32位的UUID, 而自己随便写个字符又不合适,这时就要用到函数来产生一个序列值 Oracle: select sys_guid() from dual; ...

  4. XNA 4.0 环境搭建和 Hello World,Windows Phone 游戏开发

    XNA 4.0 环境搭建和 Hello World,Windows Phone 游戏开发 使用 Scene 类在 XNA 中创建不同的场景(八) 摘要: 平方已经开发了一些 Windows Phone ...

  5. MacOSX中使用NSWindow创建背景透明的窗体

    1.Windows 在window上创建异形窗体必须要使用WS_EX_LAYERED样式,再调用SetLayeredWindowAttributes设置透明度或者透明颜色属性.用updatelayer ...

  6. spring mvc后台接收中文乱码

    可从如下几方面着手 1.jsp页面编码 2.web.xml配置字符过滤器,该字符过滤器最好放在开头 3.tomcat下server.xml添加URIEncoding="UTF-8" ...

  7. 通过Shell脚本读取properties文件中的参数时遇到\r换行符的问题

    今天在编写微服务程序启动脚本的时候,遇到一个比较奇葩的问题,下面给出具体描述: 目标:通过读取maven插件打包时生成的pom.properties文件,获取里面的应用名称和应用版本号,然后拼接得到s ...

  8. NSClassFromString,NSSelectorFromString,isKingOfClass

    1. NSClassFromString 这个方法判断类是否存在,如果存在就动态加载的,不存为就返回一个空对象; id myObj = [[NSClassFromString(@"MySpe ...

  9. jq向webApi提交post json数据

    在页面想webApi post json数据的时候,发现webapi不能直接以json的方式接受数据(注:我是没有发现一个很好的方式来post json数据的);但是可以以数据结构的方式传递: 如下: ...

  10. Java定时器Timer简述

    概述 主要用于Java线程里指定时间或周期运行任务.Timer是线程安全的,但不提供实时性(real-time)保证. 构造函数 Timer() 默认构造函数. Timer(boolean) 指定关联 ...