java的反射

2017年 3月11号 周六 晴

前言:理解java的反射能更好的理解spring的运行机制。

   因为spring的两大核心技术是Ioc(Inversion of Control,控制反转,有时也称为依赖注入,即DI,Dependcy Injection)和AOP(Aspect Oriented Programming,面向切面编程,即纵向的编程)。Ioc实现原理是java反射机制,Aop实现原理是java的动态代理。

    java的反射机制概念:

    java的反射机制是运行状态中,对于任意一个类,都能够知道此类的所有属性和方法,对于任意一个对象,都能调用该对象的任意一个方法和属性。这种动态获取信息及动态调用对象方法即为java的反射机制。

    java反射机制主要提供以下功能

    1 在运行时判断任意一个对象所属的类

    2 在运行时构造任意一个类的对象

    3 在运行时判断任意一个类所具有的成员变量和方法

    4 在运行是调用任意一个对象的方法

    5 生成动态代理

    在jdk中,主要由以下类来实现java的反射机制,这些类都位于java.lang.reflect包中。

      Class:表示正在运行的java应用程序中的类和接口。Class类是java反射中最重要的一个功能类,所有获取对象信息(包括方法,构造方法,访问权限)都由它来实现

      Field:提供有关类或接口的属性信息,以及对它的动态访问权限

      Constructor:提供关于类的单个构造方法的信息以及对它的访问权限

      Method:提供关于类或接口中某个方法信息

      Array类:提供动态创建数组,以及访问数组元素的静态方法

    在java.lang.Object类中定义了getClass()方法,因此对于任意一个java对象,都可以通过此方法获取对象类型。

    Class类是Reflection API中的核心类,它有一下方法:

    1 获取对象类型

      a   getName():获取类的完整名字

      b   getFields():获得类的public类型的属性

      c   getDeclareFields():获得类的所有属性

      d   getMethods():获得类的public类型的方法

      e   getDeclaredMethods():获取类的所有方法

      f   getMethod(String name,Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数的构造方法。

      g  getConstrutors():获得类的public类型的构造方法

      h newInstance():通过类的不带参数的构造方法创建这个类的一个对象

    2 通过默认构造方法创建一个新的对象

      Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});

      此代码先调用Class类的getConstructor()方法获得一个Constructor对象,它代表默认的构造方法,然后调用Constructor对象的newInstance()方法构造一个实例

    3 获得对象的所有属性

      Filed fileds[]=classType.getDeclareFields();

      Class类的getDeclaredFields()方法返回类的所有属性,包括public,protected,default(默认)和private访问级别的属性

    4 获得每个属性响应的getXXX()和setXXX()方法,然后执行这些方法,把原来对象的属性复制到新对象中。典型代码如下:

      for(int i=0;i Field field=fields[i];

       String filedName=field.getName();
         String firstLetter=fieldName.substring(0,1).toUpperCase();

       String getMethodName="get"+firstLetter+fieldName.substring(1);//获得和属性对应的getXXX()方法名字

       String setMethodName="set"+firstLetter+fieldName.substring(1);//获得和属性对应的setxxx()方法的名字

       Method getMethod=classType.getMethod(getMethodName, new Class[]{});//获得和属性对应的getxxx()方法

       Method setMethod=classType.getMethod(setMethodName, new Class[]{field.getType()});//获得和属性对应的setxxx()方法

       Object value=getMethod.invoke(object,new Object[]{});//调用原对象的getXXX()方法

       System.out.println(fieldName+":"+value);

       setMethod.invoke(objectCopy,new Object[]{value});}

    Method类的invoke(Object obj,new Object args[])方法接收的参数必须为对象,如果参数的基本类型数据,必须转换成相应包装类型的对象。

    Invoke()方法的返回值总是对象,如果实际被调用的方法的返回值类型是基本类型数据,那么invoke()方法会把它转换为相应的包转类的对象,再将其返回

    java.lang.Array类提供了动态创建和访问数组元素的各种静态方法。如下所示代码的ArrayTester1类的main()方法创建一个长度为10的字符串数组,接着把索引位置为5的元素设为hello,然后在读取索引位置为5的元素的值。

import java.lang.reflect.Array;
public class ArrayTest1 {
    public static void main(String[] args) throws Exception {
        Class classType = Class.forName("java.lang.String");
        //创建一个长度为10的字符串数组
        Object array = Array.newInstance(classType, 10);
        //把索引位置为5的元素设置为hello
        Array.set(array, 5, "hello");
        //读取索引位置为5的元素的值
        String s = (String) Array.get(array, 5);
        System.out.println(s);
    }

}

    

    关于java反射机制中的应用简单例子

    例子1:通过对象获取完整的包名和类名

package qianyu.com;

class Hello{
    public void say(){
        System.out.println("hello,Everyone");
    }
}

public class Demo1 {
    public static void main(String[] args) {
         Demo1 demo = new Demo1();
         System.out.println("demo:"+demo.getClass());
         System.out.println("demo:"+demo.getClass().getName());

         Hello hello = new Hello();
         System.out.println("hello:"+hello.getClass());
         System.out.println("hello:"+hello.getClass().getName());

    }
}

case1

    运行结果如下:

      demo:class qianyu.com.Demo1
      demo:qianyu.com.Demo1
      hello:class qianyu.com.Hello
      hello:qianyu.com.Hello

    如上所示:通过java的反射机制,可以在运行过程中获取对象完整的路径,实际上,在java中所有类的对象其实都是Class的实例

    例子2:实例化Class类对象

  

package qianyu.com;
class Hello1{
    public void say(){
        System.out.println("hello,Everyone");
    }
}

public class Demo2 {
    public static void main(String[] args) {
        Class<?> demo1=null;
        Class<?> demo2=null;
        Class<?> demo3=null;
        Class<?> demo4=null;
        try {
             demo1 = Class.forName("qianyu.com.Demo2");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
         demo2 = new Demo2().getClass();
        demo3=Hello.class;
        demo4=Hello1.class;
        System.out.println("本代码中Demo2类名称"+demo1.getName());
        System.out.println("本代码中Demo2类名称"+demo2.getName());
        System.out.println("同一个包中hello类名称"+demo3.getName());
        System.out.println("本代码中hello1类名称"+demo4.getName());
    }
}

case2

    运行结果如下:

    本代码中Demo2类名称qianyu.com.Demo2
    本代码中Demo2类名称qianyu.com.Demo2
    同一个包中hello类名称qianyu.com.Hello
    本代码中hello1类名称qianyu.com.Hello1

  

    

时间: 2024-12-28 01:45:29

java的反射的相关文章

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

一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:  其中 i.加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构.即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!.

Java:反射

初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的内部信息(包括其modifiers(如public, static等).superclass(如Object).interfaces(如Serializable),也包括fields和methods的所有信息),动态地生

java的反射机制

一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动,说不定会请各位吃饭哦! 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2.反射

黑马程序员——JAVA基础-反射

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都只能都调用它的任意一个 方法和属性,这种动态获取的信息一级动态调用对象的方法的功能呢个称为java 的反射机制. 反射其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象, 并将字节码文件中的内容都封装成对象,这样便于操作这些成员.就是把JAVA类中的各种成

Java 中反射机制的深入研究

昨天学习了java的反射机制,今天继续深入学习一下. 一.通过反射操作数组 反射不光只能用在类中,也可用在任意的引用数据类型上.当然包括数组. 通过java.lang.reflect.Array 类 可操作数组,java.lang.reflect.Array 类 下面提供了很多方法. 例如 public static Object get(Object array,int index)throws IllegalArgumentException,ArrayIndexOutOfBoundsExc

java中反射学习整理

转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力. java中反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装载,无须在组件之间进行链接.反射允许在编写与执行时,使程序能够接入到jvm中的类的内部信息,而不是源代码中选定的类协作的代码.这使反射成为构建灵活应用代码的主要工具.需要注意的是,如果使用不当,反射的成本会很高. package

Java 类反射机制分析

一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 在Java中的反射机制,被称为Reflection.(大家看到这个单词,第一个想法应该就是去开发文档中搜一下了.)它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法.Reflection机制

java中反射

反射 避免硬编码 类对象 (存储了类的信息的对象 类加载的产物) Class 类名.class 直接获得类对象 (简单类型的类对象 int.class) 类的对象.getClass() Class.forName("类名") 通过类名主动加载一个类并获得类对象 类对象.newInstance() 创建类的对象 java中反射,布布扣,bubuko.com

理解Java的反射与内省及其区别

java的内省机制和反射机制什么区别 内省操作只针对JavaBean,只有符合JavaBean规则的类的成员才可以采用内省API进行操作....而反射则不同,一个类的所有成员都可以进行反射操作. 内省和反射的操作也有很大不同,内省是先得到属性描述器PropertyDecriptor后再进行各种操作,反射则是先得到类的字节码Class后再进行各种操作的. 反射(reflection)(实现可扩展性智能化) 相对而言,反射比内省更容易理解一点.用一句比较白的话来概括,反射就是让你可以通过名称来得到对

黑马程序员-java基础-反射基础

------- android培训.java培训.期待与您交流! ---------- java的反射机制是java的特性之一,反射机制是构建框架技术的基础所在,使用反射可以使程序更加灵活,避免将程序写死在代码里.相对于很多初学者只接触过java基础的人,反射还是一个很朦胧难懂的概念,下面我们就来说一下反射的一些应用. java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能.java反射有3个动态性质:1.运行时生成对象实例,2.运行期间调用发放,3.运行时更改属性. 那么反射