本文參考:http://www.cnblogs.com/yydcdut/p/3845430.html

1.Java反射的基本介绍

Java的反射很强大,传递class。 能够动态的生成该类、取得这个类的全部信息,包含里面的属性、方法以及构造函数等。甚至能够取得其父类或父接口里面的内容。

Java 反射机制主要提供了下面功能:

  • 在执行时推断随意一个对象所属的类;
  • 在执行时构造随意一个类的对象;
  • 在执行时推断随意一个类所具有的成员变量和方法;
  • 在执行时调用随意一个对象的方法;
  • 生成动态代理。

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

  • Class类:代表一个类。

  • Field类:代表类的成员变量(成员变量也称为类的属性)。

  • Method类:代表类的方法。

  • Constructor 类:代表类的构造方法。

  • Array类:提供了动态创建数组,以及訪问数组元素的静态方法。
package com.hh.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method; public class ClassDemo { public static void main(String[] args) throws Exception {
//11111
System.out.println("========11111==========");
Person person1 = new Person();
Class c1 = person1.getClass(); Person person2 = new Person();
Class c2 = person2.getClass(); System.out.println(c1 == c2); //22222
System.out.println("========22222==========");
Class c3 = Person.class;
System.out.println(c1 == c3); //33333
System.out.println("========33333==========");
Class c4 = Class.forName("com.hh.reflect.Person");
System.out.println(c1 == c4);
Constructor co = c4.getConstructor(null);
Object obj = co.newInstance(null);
Method m = c4.getMethod("show", null);
m.invoke(obj, null);
} }

Person类:

package com.hh.reflect;

public class Person {
public void show(){
System.out.println("Person------->show()");
}
}

执行结果:

========11111==========
true
========22222==========
true
========33333==========
true
Person------->show()

由于项目中仅仅有一个person.class文件,所以以反射获取的到对象都是一样的。

2.反射的使用方法之中的一个

如果有两个类:1.ClassA.java   2.ClassB.java

public class ClassA {
public void show(String str){
System.out.println(str +" ClassA------>show()");
}
}
public class ClassB {
public void show(String str){
System.out.println(str + " ClassB------>show()");
}
}

再加一个配置文件who.txt。内容例如以下:

class=com.hh.reflect.ClassB
method=show

主类ReflectTest.java是这种

public class ReflectTest {

	public static void main(String[] args) throws Exception {
Properties prop = new Properties();
FileReader fr = new FileReader("who.txt");
prop.load(fr);
fr.close(); String className = prop.getProperty("class");
String methodName = prop.getProperty("method");
//获得对象的类型
Class c = Class.forName(className);
//通过默认构造方法创建一个新的对象
Constructor co = c.getConstructor(null);
Object obj = co.newInstance(null);
//获得对象的方法
Method m = c.getMethod(methodName, "Hello".getClass());
//调用对象的方法
m.invoke(obj, "Hello");
} }

当改动配置文件,使得class的属性为不同的值的时候。程序执行结果是不一样的:

① class=com.hh.reflect.ClassA

Hello ClassA------>show()

② class=com.hh.reflect.ClassB

Hello ClassB------>show()

当中"Hello"是传给show(String str)方法的參数

上面这个反射的小样例的原理。被Java框架,如Hibernate、Spring等经常使用:先用XML解析配置文件,再通过Java反射机制获取类的全部信息。

Java反射举例的更多相关文章

  1. Java反射机制剖析(二)-功能以及举例

    从<java反射机制剖析(一)>的API我们看到了许多接口和类,我们能够通过这些接口做些什么呢? 从上篇API中我们能看到它能够完成下面的这些功能: 1)     获得类 A.     运 ...

  2. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  3. 如何防止JAVA反射对单例类的攻击?

    在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...

  4. Java反射机制剖析(三)-简单谈谈动态代理

    通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1.     代理模式 代理模式就是为其他对象提供一种代理来 ...

  5. 浅谈Java反射

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

  6. 面试-java反射

    问题:简述Java中的反射使用 答: 1.作用: 可以通过配置文件来动态配置和加载类,以实现软件工程理论里所提及的类与类,模块与模块之间的解耦.反射最经典的应用是spring框架. 2. 定义 反射简 ...

  7. java反射与动态代理的理解

    一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象 ...

  8. java 反射和new的区别

    关于java 反射和new的区别,在这里我不做多讲,因为网上有大把资料,描述得很详细. 今天我只讲一点,为什么要用反射?直接用new不行么?干嘛弄得那么麻烦! 1.基本上效果差不多,但是new对象,无 ...

  9. java 反射运用

    一,获取私有的属性,方法,构造器(俗名:暴力反射) 现有一个类,属性,方法,构造器均为私有的,如何创建实例对象,更该属性值,调用方法? public class Student { private S ...

随机推荐

  1. 2013国内IT行业薪资对照表【技术岗】

    (本文为转载,具体出处不详) 说薪水,是所有人最关心的问题.我只 想说如果想在薪水上面满意,在中国,没有哪里比垄断国企好.电力.烟草.通信才是应该努力的方向.但是像我们这种搞研发的进IT行业似乎是注定 ...

  2. 字符串数组越界bug(2)

    概述 数组下标从0開始,尽管从初学都已经知道,<陷阱与缺陷>重复强调,而在指尖运动中,就有那么几次不小心,让"精子"掉进这个"洞里"!其次,C语言字 ...

  3. 如何在虚拟机中安装Win7系统

    在虚拟机里安装系统,可以很方便我们对系统的各项功能进行测试,而又不会影响本机系统,本节就介绍如何在虚拟机中安装Win7系统 . 工具/原料 vm9虚拟机 电脑一台 方法/步骤 1 在百度上搜索win7 ...

  4. java listener实现定时任务

    使用java ServletContextListener 实现各种简单定时任务. 1. 创建ServletContextListener,在3.0版本的web.xml中不再需要添加listener的 ...

  5. C# XML流操作简单实例

    这里我们先介绍操作XML文件的两个对象:XmlTextReader和XmlTextWriter打开和读取Xml文件使用到的对象就是XmlTextReader对象.下面的例子打开了与程序在同一路径下的一 ...

  6. xp sp3安装 iis5.1

    1.依次打开左下角的 "开始" 菜单----控制面板----选择 "添加/删除程序", 点击窗体左侧 "添加/删除Windows组件"(A) ...

  7. Arcgis Engine - 鹰眼(减少闪烁)

    网上看到的代码,都是一个模样,经过不断调试,无意中效果就可以了.主要是在"鼠标拖动的时候",网上的代码的鹰眼效果,感觉坑爹死了,闪烁超级严重.主要原因是鼠标拖动的时候,进行时时更新 ...

  8. SqlServer 开启或关闭数据库主键自增

    可用作删除一行主键数据库,在还原数据行,或者删掉后,被伤处的主键还可以利用 --开启当前表的可复制功能,仅在当前回话中有效 SET IDENTITY_INSERT  dbo.PDAUserInfo O ...

  9. 为什么子线程不能做UI操作

    在子线程中是不能进行UI 更新的,而可以更新的结果只是一个幻像:因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就 让大家误以为分线程可以更新U ...

  10. avalon

    http://avalonjs.coding.me/ 有时间详细写