本文參考: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. c# winform InvokeRequired 解决跨线程访问控件

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它. Windows 窗体中 ...

  2. 规约模式(Specification Pattern)

    前期准备之规约模式(Specification Pattern) 一.前言 在专题二中已经应用DDD和SOA的思想简单构建了一个网上书店的网站,接下来的专题中将会对该网站补充更多的DDD的内容.本专题 ...

  3. Ubuntu中安装编译并测试HTK语音识别库

    1.在网上看到首先必须确保电脑上安装了g++和libx11 g++ --version //检测g++版本 sudo apt-get install libx11-dev:i386 2.然后可从HTK ...

  4. mysql 5.7.9(GA) 安装

    mysql 5.7.9(GA) 终于发布了,感受一下. 一.下载 下载页面 http://dev.mysql.com/downloads/mysql/ 选择相应系统的版本下载. 本文OS为centos ...

  5. C++ Primer 5th 第4章 表达式

    表达式是运算对象及运算符组成的式子,表达式求值将得到一个结果,单独的变量或者字面值也算表达式,结果是其本身. 运算符分为:一元运算符.二元运算符.三元运算符.一元即一个作用对象,二元两个作用对象,以此 ...

  6. google反向代理网址收集

    前言 亲,还在为谷歌被墙而懊恼么?还在苦苦搜集FQ手段么?往下看吧? 最近在网站链接来源统计中,发现了很多反向代理了谷歌的链接,故搜集在这里,供需要的人使用,使用如下链接谷歌搜素不需要FQ哦?下面地址 ...

  7. IE,火狐,谷歌浏览器下js判断滚动条是否已拉到页面最底部

    E/FF/Chrome下document.documentElement和document.body的 scrollHeight/scrollTop/clientHeight 以及判断滚动条是否已拉到 ...

  8. python学习第六天 条件判断和循环

    总归来讲,学过C语言的同学,对条件判断和循环并不陌生.这次随笔只是普及一下python的条件判断和循环对应的语法而已. 条件判断: 不多说,直接贴代码: age = 23 if age >= 6 ...

  9. HTML&CSS基础学习笔记1.7-高亮文本及组合使用

    HTML提供了<mark>标签可以让你的文本高亮,这样看起来更加醒目.<mark>标签内的文本会呈现特殊的样式,它和<em>,<strong>一样也是一 ...

  10. pyqt5通过文本对话框打开文件

    点击按钮,打开文本对话框,找一人文件,打开并显示内容 QFIleDialog                                                              ...