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 ...
随机推荐
- 数据库系统原理及其应用总结---ShinePans
第一章 数据库概论 1.在数据库管理技术的发展过程中.数据库独立性最高的是"数据库系统"阶段 2.三大经典的数据结构模型是"关系.层次和网状模型" 3.单个用 ...
- apache ab工具对网站进行压力测试
Apache -- ab工具主要测试网站的(并发性能) 这个工具非常的强大. 基本语法 : cmd>ab.exe –n 请求总次数 -c 并发数 请求页面的url 进入到ab.ex ...
- NUnit单元测试初试
创建项目,创建几个方法 创建测试类 开启NUnit测试工具,新建一个测试项目 打开测试的程序集 选择节点,点击测试,绿色通过,红色说明有错误
- ASP.NET常用编程代码(二)
1.绑定在DataList中的DropDownList private void dlistOrder_EditCommand(object source, System.Web.UI.WebCont ...
- Oracle 11g XML java连接
在网上找了好多教程 走好好多弯路 现在从头总结下 oralce11g 可以直接用xmltype节点存储xml文件 简单来说就是直接存一个文件进去 首先安装oracle11g 网上教程非常多 然后进Ne ...
- Java学习笔记(2):jdk的配置
配置Java的开发环境 先说明一下,我的jdk文件目录是:D:\language\java\java soft\jdk1.6 JDK的安装与配置 解压“开发软件”中的jdk1.6.rar(解压版)到D ...
- Jade学习笔记
初学nodejs,折腾过用handlebars做模板,后来隔了一段重新学习,用了jade,真心简洁……记录一些学习笔记,以备复习. jade是基于缩进的,所以tab与space不能混用: 属性的设置: ...
- JavaScript高级程序设计第20章JSON 笔记 (学习笔记)
第二十章 JSON 1.Json 可以表示三种类型的值: 1.简单值: 表示数值:5 表示字符串:“hello wrold”注表示字符串时必须使用双引号 2.对象: {“name”:“mi”,”ag ...
- css透明度的一些兼容测试
前言 网站丢给了外包公司来弄,但是老外写css的时候似乎没有考虑到国内的浏览器市场,于是只用了opacity这个属性来写,当IE8-的浏览器访问的时候,浮动层就像一块大黑斑药膏贴在哪里.很显然,婀娜多 ...
- C语言---return(我的工程笔记本)
迷惑了一天 函数就是输出有问题,进入函数设置密码的时候,当我保存密码准备返回,问题就在此时诞生了,界面是主界面,但功能函数还是没反应,设置序列号初始值的原来按键却还是有反应,莫名其妙,莫名其妙... ...