JAVA反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

为了演示,我们定义一个用于测试的类:

public class ReflectObj
{
   private int variable1;
   public int variable2;

   public static int variable3;
   public static int variable4;

   public ReflectObj()
   {
      System.out.println("invoke method ReflectObj()");
   }

   public ReflectObj(int var)
   {
      System.out.println("invoke method ReflectObj(int var)");
   }

   private ReflectObj(String var)
   {
      System.out.println("invoke method ReflectObj(String var)");
   }

   private void method1()
   {
      System.out.println("invoke method method1()");
   }

   private void method1(int var)
   {
      System.out.println("invoke method method1(int var)");
   }

   public void method2()
   {
      System.out.println("invoke method method2()");
   }

   public void method2(int var)
   {
      System.out.println("invoke method method2(int var)");
   }

   public static void method3()
   {
      System.out.println("invoke method method3()");
   }

}

然后我们可以针对这个类编写测试反射效果的测试类:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest
{
   public static void main(String[] args) throws Exception
   {
      // 获得类的对象
      Class<ReflectObj> clazz = ReflectObj.class;

      // 获得ReflectObj的信息
      System.out.println("ReflectObj的简单类名:" + clazz.getSimpleName());

      // 实例化ReflectObj对象
      ReflectObj obj1 = clazz.newInstance();

      // 通过指定构造方法实例化对象
      Constructor<ReflectObj> constructor1 = clazz
            .getDeclaredConstructor(String.class);
      // 因为构造方法是私有的,所以需要设置允许访问
      constructor1.setAccessible(true);
      ReflectObj obj2 = constructor1.newInstance("");

      // 获得所有已定义字段
      Field[] fields = clazz.getDeclaredFields();
      if (fields != null)
      {
         for (Field field : fields)
         {
            System.out.println("name:" + field.getName() + " type:"
                  + field.getType());
         }
      }

      // 执行指定方法
      Method method2 = clazz.getMethod("method2");
      // 执行obj1的method2方法
      method2.invoke(obj1);

      // 执行静态方法
      Method method3 = clazz.getMethod("method3");
      method3.invoke(null);
   }
}

反射机制在实际开发中是很实用的,但是相应的我们要牺牲一点执行效率,上述示例中仅介绍了反射中的部分方法,大家可以自己尝试写一下,多数方法的含义都是类似的。

时间: 2024-10-17 22:38:53

JAVA反射机制的相关文章

Java反射机制:包括组成、结构和示例说明等内容

第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据"类的部分已经的信息"来还原"类的全部的信息".这里"类的部分已经的信息",可以是"类名"或"类的对象"等信息."类的全部信息"就是指"类的属性,方法,继承关系和Annotation注解"等内容. 举个简单的例子:假设对于类ReflectionTest.java,我们知道的

java反射机制系列(二)例子

下面我以顾客买相机为例来说明Java反射机制的应用.例子中涉及的类和接口有: Camera接口:定义了takePhoto()方法. Camera01类:一种照相机的类型,实现Camera接口. Camera02类:另一种照相机的类型,实现Camera接口. Seller类:卖照相机. Customer类:买相机,有main方法. 所有类都放在com包里 程序如下: public interface Camera { //声明照相机必须可以拍照 public void takePhoto(); }

java 反射机制系列(一) 初识Java Reflection

Java 反射机制是指Java程序可以在执行期载入,探知,使用编译期间完全未知的classes.这句话可能有点难以理解,我们可以通过一个例子来看.在Java程序中我们经常会用到这样一条语句来创建一个对象.Date date = new Date();在这条语句中date的类型(Java.util.Date)在编译时 已经确定.那么,有没有办法使我们把对象类型的确定时间由编译转到运行,答案是肯定的.这就是Java反射机制所提供的便利.而且它不单单可以生成对象还可以获取Field,对Field设值,

使用Java反射机制确定基本数据类型属性

Java反射机制提供了一种强大的应用程序接口来帮助我们在运行时检测和执行对象上的操作.该机制允许程序员审视一个未知对象,并且获得它的属性,例如对象上的方法,JavaBean的属性以及继承关系等. Java中有两种类型的值,一种是类类型,它把对象的属性定义在一个类中.类类型是面向对象结构的基本组成部分.第二种类型的值是基本数据类型.反射类型通常用于类类型,但是,其实它也可以很方便应用到Java的基本类型上. Java中的基本类型继承自基于C的语法,其中包括boolean.byte.short.in

java 利用java反射机制动态加载类的简单实现_java

如下所示: ////////////////// Load.java package org.bromon.reflect; import java.util.ArrayList; import java.util.List; public class Load implements Operator { @Override public List<?> act(List<?> params) { // TODO Auto-generated method stub List<

Java 反射机制详解及实例代码_java

Java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * */ class Demo{ //other codes... } class hello{ public static void main(String[] args) {

reflection的应用-java反射机制的小应用

问题描述 java反射机制的小应用 怎样自己写一个通用的BaseDao(利用反射写出通用的增.删.改.查的方法) 解决方案 去看下hibernate的源码

java反射机制 getreturntype是如何知道方法返回值类型的

问题描述 java反射机制 getreturntype是如何知道方法返回值类型的 各位大神,小弟有一事不明 我们有一个变量,就是方法名 java反射机制 getReturnType()是如何知道我要定义的这个方法的返回值类型. 它怎么知道我要的这个方法应该返回什么值?? 解决方案 java编译后的.class文件里面记录了类的全部信息,包括方法的返回值.参数.异常等.程序运行时,.class文件会被加载到运行时数据区,java反射 机制就是从类型信息中获取装载类解析后的详细信息的. 解决方案二:

java反射机制剖析(一)—简介

    由之前动态代理的学习再次接触到反射这个知识点,第二次接触了所以做了一些稍微深入的了解.那么,对于反射这部分的内容我打算分三篇博客来总结.本篇博客先对反射做一个大概的了解,包括反射有关的RTTI.定义的理解以及涉及到的其他知识的简介. 回顾     java之前我接触反射这个知识,是在大话设计中的抽象工厂模式里,通过反射+配置文件来优化抽象工厂提高其应对需求变更的灵活性.当时对于反射的认知仅仅是它是一种技术,一种实例化对象的技术,一种实例化对象不依赖于写死的代码的技术.简单的说就是,它是一

Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法?

问题描述 Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法? Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法?而要invoke来调用对象的方法? 解决方案 知道方法的话当然可以不用invoke.需要invoke的方法大多是在写代码的时候无法确定的 解决方案二: 问题出现的场景是什么? 解决方案三: 面向接口,有些包是不同厂商实现的 反射能通过编译,在运行时才报错 解决方案四: 没有你想的那么简单,你多看看java的设计模式,和