Java反射举例
本文參考: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反射举例的更多相关文章
- Java反射机制剖析(二)-功能以及举例
从<java反射机制剖析(一)>的API我们看到了许多接口和类,我们能够通过这些接口做些什么呢? 从上篇API中我们能看到它能够完成下面的这些功能: 1) 获得类 A. 运 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- 如何防止JAVA反射对单例类的攻击?
在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...
- Java反射机制剖析(三)-简单谈谈动态代理
通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1. 代理模式 代理模式就是为其他对象提供一种代理来 ...
- 浅谈Java反射
什么是反射? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语 ...
- 面试-java反射
问题:简述Java中的反射使用 答: 1.作用: 可以通过配置文件来动态配置和加载类,以实现软件工程理论里所提及的类与类,模块与模块之间的解耦.反射最经典的应用是spring框架. 2. 定义 反射简 ...
- java反射与动态代理的理解
一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象 ...
- java 反射和new的区别
关于java 反射和new的区别,在这里我不做多讲,因为网上有大把资料,描述得很详细. 今天我只讲一点,为什么要用反射?直接用new不行么?干嘛弄得那么麻烦! 1.基本上效果差不多,但是new对象,无 ...
- java 反射运用
一,获取私有的属性,方法,构造器(俗名:暴力反射) 现有一个类,属性,方法,构造器均为私有的,如何创建实例对象,更该属性值,调用方法? public class Student { private S ...
随机推荐
- JavaScript的68个技巧一
1. 严格模式 在自己的项目中 你可以坚持只使用" 严格模式 " 或只使用" 非严格模式 "的策略.但如果你要编写健壮的代码应对各种各样的代码连接 你有两个可选 ...
- USB HID介绍
HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复习一下USB协议的相关内容. USB设备描述符-概述 当插入USB设备后,主机会向设备请求各种描述符来识别设备.那什么是设 ...
- Cretiria查询应用(二)
1.条件查询,动态查询 public void conditionQuery(){ Session session=null; try { session=HibernateUtil.currentS ...
- pd的django To do list教程-----(2)models模型的建立
1:在models.py中建表 from django.db import models class Tcontent(models.Model): content = models.CharFiel ...
- 基于live555的一个简单RTSP服务器
1,编译live555源码目录下的 BasicUsageEnvironment.groupsock.liveMedia.UsageEnvironment四个工程生成相应的库文件: 目录结构如下: 2, ...
- DX笔记之五------游戏画面绘图之绘制位图
本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7335103 共四步 步骤一:加载位图 步骤二:建立与 ...
- hdu5392 Infoplane in Tina Town(LCM)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Infoplane in Tina Town Time Limit: 14000/ ...
- OpenSceneGraph FAQ
转自http://www.cnblogs.com/indif/archive/2011/04/22/2024805.html 1.地球背面的一个点,计算它在屏幕上的坐标,能得到吗? 不是被挡住了吗? ...
- nodemon 或者 Supervisor 监控 Express4.x的代码改动
Express 4.x 默认将启动模块分离到了./bin/www中,直接使用 supervisor/nodemon 无法正常监控应用,使得开发过程中的调试非常不方便.所以我们直接把./bin/www中 ...
- nginx_http核心模块(二)
对一些常用的配置项做一些解释:详细请看官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html 1. alias Syntax: ali ...