浅浅谈Java反射机制( JAVA Reflection)

原创 2015年11月18日 00:15:02

首先有两个问题:

 1> 什么是Java的反射机制?
 2> 反射机制有什么作用?

<1> 反射机制指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。


<2>反射能够让我们:

运行时检测对象的类型;动态构造某个类的对象;检测类的属性和方法,并调用;任意调用对象的方法;修改构造函数、方法、属性的可见性;

用处:

对于Web框架,开发人员在配置文件中定义他们对各种接口和类的实现。通过反射机制,


例如,Spring框架使用如下的配置文件:

<bean id="someID" class="com.programcreek.Foo">
    <property name="someField" value="someValue" />
</bean>

当Spring容器处理元素时,会使用Class.forName(“com.programcreek.Foo”)来初始化这个类,并再次使用反射获取元素对应的setter方法,为对象的属性赋值。

Servlet也会使用相同的机制:

<servlet>
    <servlet-name>someServlet</servlet-name>
    <servlet-class>com.programcreek.WhyReflectionServlet</servlet-class>
<servlet>

介绍三个对象的机制与实现:

类对象(Class类的某一个具体类对象)
实例化对象(某一具体类的实例对象)


a. Class对象的机制与实现(假设已经存在普通类Book)

Class就是类的类型。IntegerString...这些类的类型就是Class
1 三种*类对象*的获取方式
 Class cl1 (类的类型) = Class.forName("一个类的完整路径名")
2 类的实例化对象来获取类对象
 Object ob = new Book();
 Class cl2 (类的类型) = ob.getClass();
3 直接使用类.class
 Class cl3 = Book.class;     

通过类对象可以实例化一个对象

Book bk = (Book)cl1.newInstance();  //默认返回一个Object类的对象,实例化类对象,无参,无参。    

b. Field对象的机制与实现

Java.lang.reflect.Field类,用于表示类中,接口中属性对象的类。
可以操作类中私有,以及公有等全部属性和属性的信息。

package com.java.test;

import com.java.bean.Book;

import java.lang.reflect.Field;

public class TestField {

    //使用传递过来的Class对象获取类中的属性
    public void show(Class cls){

        //数组中每一个Field对象都是Book的一个属性
        Field[] fid = cls.getDeclaredFields();       //可以将私有属性获取到
        //Field[] fid = cls.getFields();             //只能获取到公有属性
        for (Field f : fid){
            System.out.println(f.getName());
            System.out.println(f.getType());
        }
    }

    //该方法使用传递过来的实体类对象获取属性
    public void show2(Object obj){
        Class cls = obj.getClass();      //获取类对象,感觉还是回到了第一种方式
        Field[] fid = cls.getDeclaredFields();
        for (Field fi : fid){
            try {
                fi.setAccessible(true);   //可以理解为启用私有属性的访问权限
                System.out.println(fi.getName()+"值: "+fi.get(obj));//get是将属性值取出来
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Book bk = new Book();
        bk.setId(1);
        bk.setName("JVM虚拟机");
        bk.setType("Java");

        TestField tf = new TestField();
        //tf.show(Book.class);
        tf.show2(bk);
    }
}

c. Method对象的机制与实现
Java.lang.reflect.Method类是用于表示类中,接口中方法对象的类。
可以操作类中私有,以及公有…全部方法。

package com.java.test;

import com.java.bean.Book;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class TestMethod {

    //该方法用于获取对象的所有方法名称 返回值类型 以及参数信息
    public void show(Object obj){
        Class cls = obj.getClass();
        Method[] me = cls.getDeclaredMethods();  //获取到Book类中所有的方法
        for (Method m : me){
            System.out.println("Name: "+m.getName());           //方法名
            System.out.println("Type: "+ Modifier.toString(m.getModifiers()));      //方法修饰符
            System.out.println("Return: "+m.getReturnType());   //方法返回值
            Class[] praType = m.getParameterTypes();            //获取方法参数
            System.out.println("params: ");
            for (Class c : praType){
                System.out.println(c.getName());
            }
        }

        try {
            Method mt = cls.getMethod("getName",null);   //获取到方法后进行调用
            try {
                //此处如果有多个参数的话,先把参数保存在数组(数组可以为Object类型)里。
                mt.invoke(obj,new Object[0]);   //obj对象调用getName()方法,参数为null(有点反射的意思了呦)
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Book bk = new Book();
        bk.setId(1);
        bk.setName("JVM虚拟机");
        bk.setType("Java");

        TestMethod tm = new TestMethod();
        tm.show(bk);
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java进阶之reflection(反射机制)——反射概念与基础

这里写链接内容  反射机制是Java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言?一、动态语言动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的...
  • xu__cg
  • xu__cg
  • 2016年10月20日 22:00
  • 2607

Java学习笔记之反射(Reflection)

什么是反射能够分析类能力的程序称为反射(reflection)反射可以用来干什么Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的...
  • GongchuangSu
  • GongchuangSu
  • 2016年07月21日 10:56
  • 1514

java的反射机制Reflection(重点、难点)

1、在集合中必须使用泛型;
  • lpp1234567
  • lpp1234567
  • 2014年03月10日 16:59
  • 739

java反射机制(1)- 知识点总结Java Reflection API操作

转载需注明出处:java反射机制(1)- 知识点总结Java Reflection API操作1 什么是反射机制  什么是反射机制?简单点说就是程序在运行时能够获取自身的信息。在java中,只要给定类...
  • Mark_LQ
  • Mark_LQ
  • 2015年11月28日 17:02
  • 1913

Java反射机制( JAVA Reflection)

首先有两个问题: 1> 什么是Java的反射机制? 2> 反射机制有什么作用?1212 反射机制指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java...
  • wushiwude
  • wushiwude
  • 2017年04月12日 11:29
  • 83

java反射机制的实现原理 (二)安全性和反射

安全性和反射:在处理反射时安全性是一个较复杂的问题。反射经常由框架型代码使用,由于这一点,我们可能希望框架能够全面接入代码,无需考虑常规的接入限制。但是,在其它情况下,不受控制的接入会带来严重的安全性...
  • wszjfei
  • wszjfei
  • 2011年05月12日 13:44
  • 3646

JAVA 反射机制--reflection

1.关于JAVAf 反射机制的一些基本的介绍参见好搜百科http://baike.haosou.com/doc/5458411-5696799.html或者搜索关键字“JAVAf 反射机制”。 2.这...
  • u011672034
  • u011672034
  • 2015年05月14日 11:14
  • 286

java反射机制(Reflection)

一、了解Class对象java的对象有两种,实例对象和Class对象。 实例对象就是平常我们定义的一个类,然后定义这个类的实例,可以用new关键字新建。 但是Class对象不能用new关键字新建。...
  • onpwerb
  • onpwerb
  • 2016年09月09日 07:20
  • 143

Java的反射机制(Reflection)

反射机制   指可以在运动时加载、探知、使用编译期间完全未知的类   程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够获取这个类的属性和方法;对于任意一个对象可以调用...
  • u010177899
  • u010177899
  • 2017年03月29日 10:54
  • 36

Java Reflection 反射机制_学习

JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称...
  • douxinchun
  • douxinchun
  • 2014年05月09日 14:36
  • 356
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅浅谈Java反射机制( JAVA Reflection)
举报原因:
原因补充:

(最多只允许输入30个字)