所谓反射。是指在执行时状态中,获取类中的属性和方法。以及调用当中的方法的一种机制。

这样的机制的作用在于获取执行时才知道的类(Class)及当中的属性(Field)、方法(Method)以及调用当中的方法,也能够设置当中的属性值。

在Java中实现反射最重要的一步,也是第一步就是获取Class对象,得到Class对象后能够通过该对象调用对应的方法来获取该类中的属性、方法以及调用该类中的方法。
Java中反射有例如以下几种实现方式:
1、通过Class.forName()方法载入字符串,就能够得到该字符串做代表的Class对象。

比如:Class<?

> clazz = Class.forName("java.lang.String")就能够得到String类的Class对象。

值得注意的是,字符串必须是类的全名。即包名+类名。

下边的代码是Struts配置文件struts.xml中的一个action的配置。

 
<action name="registe" class="cn.com.huixin.struts2.RegisteAction">
   <result>/registeResult.jsp</result>
   <result name="input">/registe2.jsp</result>
</action>
 
这里的class属性给出了一个类的全名的字符串,server是怎样通过这个字符串得到类对象的呢?就是通过反射机制RegisteAction对象的。

然后再去调用这个类中的默认的execute()方法。

2、通过类名调用class属性得到该类的Class对象。
比如:Class<?> clazz = String.class也能够得到String类的Class对象。

3、调用实例的getClass()方法。
比如:Date date = new Date();

          Class<?> clazz = date.getClass();
通过上边的两句代码就能够得到date实例的Class对象。


1 获取 反射的对象

package com.qianfeng.reflect;

import com.qianfeng.domain.Person;

/*
反射:动态获取类或类中成员。并使用类或类中成员
获取一个类字节码文件对象的方式 (类名的.class)
*/
public class ReflectDemo1 { public ReflectDemo1() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) throws ClassNotFoundException { //get1();
//get2();
get3(); }
private static void get3() throws ClassNotFoundException {
//通过字符串形式的名称来获取字节码文件对象,不须要对象。也不须要类
Class claz = Class.forName("com.qianfeng.domain.Person");
System.out.println(claz); }
private static void get2() {
//每一个数据类型都有一个class属性,能够通过类的该属性获取其所属类的字节码文件对象
//不须要对象。可是须要类
Class claz = Person.class;
Class claz2 = Person.class; System.out.println(claz==claz2); }
private static void get1() {
//方式一:通过对象来获取所属类的字节码文件对象
//不论什么一个对象都有其所属类的字节码文件对象
//new Person() Person.class
//特点:这样的方式须要创建对象 Person p1 = new Person(); Class claz1 = p1.getClass();//Person.class Person p2 = new Person(); Class claz2 = p2.getClass();//Person.class System.out.println(claz1==claz2); } }

2  获取反射的对象的构造方法
package com.qianfeng.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import com.qianfeng.domain.Person; public class ReflectDemo2 { /**
* @param args
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws SecurityException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalArgumentException
*/
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
//动态获取类。并创建对象 createObj(); createObj2();
} private static void createObj2() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//动态获取类
String str="com.qianfeng.domain.Person";
Class claz = Class.forName(str);
//int.class;
//使用带參数的构造方法创建对象
//首先要得到带參数的构造方法
//Person p = new Person("lsdjkf",34);//String.class int.class Constructor con = claz.getConstructor(String.class,int.class); //使用获取到的构造方法创建对象 Object obj = con.newInstance("李四",29);//调用构造方法对象的newInstance()方法 System.out.println(obj); } private static void createObj() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//Person p = new Person();
//1载入Person.class 2:开辟内存 3:构造方法 //动态获取类
String str="com.qianfeng.domain.Person";
Class claz = Class.forName(str); //创建对象
Object obj = claz.newInstance();//调用这个字节码文件对象的newInstance()方法 System.out.println(obj); } }

3 获取对象中的成员变量

package com.qianfeng.reflect;

import java.lang.reflect.Field;

public class ReflectDemo3 {

	/**
* @param args
* @throws ClassNotFoundException
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {
// 动态获取类并创建对象后。訪问成员属性 accessField(); } private static void accessField() throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {
//Person p = new Person();
//p.name = "";
//动态获取类
String str="com.qianfeng.domain.Person";
Class claz = Class.forName(str); //获取字段
//Field f = claz.getField("name");//仅仅能获取权限是public的字段
Field f = claz.getDeclaredField("name");
//System.out.println(f); //给字段赋值--须要先有对象
//创建对象
Object obj = claz.newInstance(); //设置权限为可訪问的 f.setAccessible(true);//暴力訪问 //给字段赋值 f.set(obj, "小花"); System.out.println(obj); } }

4 获取对象中的方法

package com.qianfeng.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class ReflectDemo4 { /**
* @param args
* @throws ClassNotFoundException
* @throws SecurityException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//动态获取类并创建对象后。訪问成员方法 // accessMethod();
accessMethod1();
accessMethod2(); } private static void accessMethod2() throws NoSuchMethodException, SecurityException, ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//动态获取类
String str="com.qianfeng.domain.Person";
Class claz = Class.forName(str); Method m = claz.getMethod("meth", null); m.invoke(null,null); } //得到带參数的方法并运行
private static void accessMethod1() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//动态获取类
String str="com.qianfeng.domain.Person";
Class claz = Class.forName(str); Method m = claz.getMethod("func", String.class); Object obj = claz.newInstance(); m.invoke(obj, "haha"); }
//得到不带參数的方法并运行
private static void accessMethod() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//动态获取类
String str="com.qianfeng.domain.Person";
Class claz = Class.forName(str); Method m = claz.getMethod("show",null); //创建对象
Object obj = claz.newInstance(); m.invoke(obj,null); } }

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Java 反射 想的更多相关文章

  1. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  2. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  3. java反射 之 反射基础

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

  4. 【转】Java反射 之 反射基础

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

  5. java 反射的应用 以及通过反射 用到的工厂模式

    java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案 ...

  6. 反射——Java反射机制

    反射概述 什么是反射? ①   反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ②   JAVA反射机制是在运行状态中,对应任意一个类,都能 ...

  7. java反射实现动态代理

    参考:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html http://my.oschina.net/lyp3314/b ...

  8. java反射的基础学习代码

    java反射的学习,好多东西不太理解,主要分析了constructor,method,field,数组和调用main函数等反射的多个方面小例子. 主要的练习类 package javaAdvanced ...

  9. [转]java反射机制

    原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html 一.什么是反射机制         简单的来说,反射机制指的是程序在运 ...

随机推荐

  1. 用golang写的 分解x86 intel boot/recovery工具

    源代码地址: https://github.com/sndnvaps/pack-unpack-intel

  2. 认识Backbone (五)

    Backbone.Router(路由)/ Backbone.history(历史)  Backbone.Router 为客户端路由提供了许多方法,并能连接到指定的动作(actions)和事件(even ...

  3. 白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连续7-电话问卷调查

    [例7-3  文本编辑框创建一个简单的调查问卷] 01     <!DOCTYPEhtml> 02     <html> 03     <head> 04     ...

  4. 【Android进阶】快捷图标的创建与移除

    注释已经说得很清楚了,如果有疑问,请留言 /** * 添加桌面快捷方式 * * @param view */ public void click1(View view) { if (isExit()) ...

  5. ajax jsonp跨域

    js跨域问题是指:js不同域进行数据传输或通信之间,让我们用ajax到不同的域请求数据.或js获得在不同领域的框架页(iframe)数据.只有到协议.域名.port无论是有不同的.它们被认为是不同的域 ...

  6. 集成ejs和angular

    我们也有一个系统angular用在应用中单页.正确angular做一些定制.集成seajs.不实用angular自己的模块管理. 只要angular也可单独使用在,一个较小的系统新开发,我不会用前js ...

  7. 创建在SQLServer 和 Oracle的 DBLINK

    dblink 当我们要跨本地数据库.訪问另外一个数据库表中的数据时,本地数据库中就必需要创建远程数据库的dblink,通过dblink本地数据库能够像訪问本地数据库一样訪问远程数据库表中的数据. 一 ...

  8. 第一章 工欲善其事 其利润—Android SDK工具(2)

    1.2设备管理工具-调试桥(ADB) 1.2.1ADB简单介绍 ADB全称是Android Debug Bridge,是Android SDK里自带的一个工具,用这个工具能够直接操作管理Android ...

  9. SQL Server 日期相关

    原文:SQL Server 日期相关 原帖出处:http://blog.csdn.net/dba_huangzj/article/details/7657979 对于开发人员来说,日期处理或许简单,或 ...

  10. JAVA缓存技术之EhCache(转)

    最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考.此为转贴,帖子来处:http://cogipard.info/ar ...