- 浏览: 31220 次
- 性别:
- 来自: 上海
最近访客 更多访客>>
最新评论
-
punan7005:
这不就是我们公司吗
转(坚决抛弃powerdesigner建模) -
jkluooop:
我尝试过啊,很郁闷,在第一次访问的时候IE跟FFX下老弹出登录 ...
JCIFS相关 -
every:
你好
请教2008 ad 如何配置ssl
AD、CA、SSL,绑定keystore
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。
现在很多流行的框架,像Spring,Hibernate都用到了java的反射机制。
下面通过一些测试程序来熟悉java反射API
其中主要类有Class、Field、Method、Modifier、Constructor、Aarry 等。具体的查看API
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
- import java.util.Scanner;
- @SuppressWarnings("unchecked")
- public class TestReflection01 {
- public static void main(String[] args) {
- System.out.println("请输入类型名称:");
- Scanner scan = new Scanner(System.in);
- String className = scan.next();
- System.out.println("当前类型:" + className);
- try {
- //获取Class对象
- Class c = Class.forName(className);
- //解析属性信息
- Field[] fs = c.getDeclaredFields();
- for (Field f : fs) {
- System.out.println("----------------------------------------------");
- System.out.println("属性:" + f.toString());
- System.out.println("\t数据类型:" + f.getType());
- System.out.println("\t属性名:" + f.getName());
- int mod = f.getModifiers();
- System.out.println("\t属性修饰符:" + Modifier.toString(mod));
- }
- //解析方法信息
- Method[] ms = c.getDeclaredMethods();
- for(Method m : ms){
- System.out.println("----------------------------------------------");
- System.out.println("方法:" + m.toString());
- System.out.println("\t方法名:" + m.getName());
- int mod = m.getModifiers();
- System.out.println("\t方法修饰符:" + Modifier.toString(mod));
- System.out.print("\t方法参数列表:");
- Class pts[] = m.getParameterTypes();
- for (int i = 0; i < pts.length; i++) {
- Class class1 = pts[i];
- if(i != 0 )
- System.out.print(", ");
- System.out.print(class1);
- }
- System.out.println();
- System.out.println("\t返回值类型:" + m.getReturnType());
- }
- //解析构造方法信息
- Constructor[] cs = c.getDeclaredConstructors();
- for (Constructor con : cs) {
- System.out.println("----------------------------------------------");
- System.out.println("构造方法:" + con.toString());
- System.out.println("\t方法名:" + con.getName());
- int mod = con.getModifiers();
- System.out.println("\t方法修饰符:" + Modifier.toString(mod));
- System.out.print("\t方法参数列表:");
- Class pts[] = con.getParameterTypes();
- for (int i = 0; i < pts.length; i++) {
- Class class1 = pts[i];
- if(i != 0 )
- System.out.print(", ");
- System.out.print(class1);
- }
- System.out.println();
- }
- System.out.println("----------------------------------------------");
- //解析当前类类型的父类
- Class superClass = c.getSuperclass();
- System.out.println("当前类的父类:" + superClass.toString());
- System.out.println("----------------------------------------------");
- //解析当前类实现的接口
- Class[] interfaces = c.getInterfaces();
- System.out.print("当前类所实现接口:");
- for (Class class1 : interfaces) {
- System.out.print(class1.toString() + "\t");
- }
- System.out.println("\n----------------------------------------------");
- //解析当前类型所在包信息
- Package p = c.getPackage();
- System.out.println("当前类所在包" + p.toString());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- }
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Scanner; @SuppressWarnings("unchecked") public class TestReflection01 { public static void main(String[] args) { System.out.println("请输入类型名称:"); Scanner scan = new Scanner(System.in); String className = scan.next(); System.out.println("当前类型:" + className); try { //获取Class对象 Class c = Class.forName(className); //解析属性信息 Field[] fs = c.getDeclaredFields(); for (Field f : fs) { System.out.println("----------------------------------------------"); System.out.println("属性:" + f.toString()); System.out.println("\t数据类型:" + f.getType()); System.out.println("\t属性名:" + f.getName()); int mod = f.getModifiers(); System.out.println("\t属性修饰符:" + Modifier.toString(mod)); } //解析方法信息 Method[] ms = c.getDeclaredMethods(); for(Method m : ms){ System.out.println("----------------------------------------------"); System.out.println("方法:" + m.toString()); System.out.println("\t方法名:" + m.getName()); int mod = m.getModifiers(); System.out.println("\t方法修饰符:" + Modifier.toString(mod)); System.out.print("\t方法参数列表:"); Class pts[] = m.getParameterTypes(); for (int i = 0; i < pts.length; i++) { Class class1 = pts[i]; if(i != 0 ) System.out.print(", "); System.out.print(class1); } System.out.println(); System.out.println("\t返回值类型:" + m.getReturnType()); } //解析构造方法信息 Constructor[] cs = c.getDeclaredConstructors(); for (Constructor con : cs) { System.out.println("----------------------------------------------"); System.out.println("构造方法:" + con.toString()); System.out.println("\t方法名:" + con.getName()); int mod = con.getModifiers(); System.out.println("\t方法修饰符:" + Modifier.toString(mod)); System.out.print("\t方法参数列表:"); Class pts[] = con.getParameterTypes(); for (int i = 0; i < pts.length; i++) { Class class1 = pts[i]; if(i != 0 ) System.out.print(", "); System.out.print(class1); } System.out.println(); } System.out.println("----------------------------------------------"); //解析当前类类型的父类 Class superClass = c.getSuperclass(); System.out.println("当前类的父类:" + superClass.toString()); System.out.println("----------------------------------------------"); //解析当前类实现的接口 Class[] interfaces = c.getInterfaces(); System.out.print("当前类所实现接口:"); for (Class class1 : interfaces) { System.out.print(class1.toString() + "\t"); } System.out.println("\n----------------------------------------------"); //解析当前类型所在包信息 Package p = c.getPackage(); System.out.println("当前类所在包" + p.toString()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import p2.User;
- @SuppressWarnings("unchecked")
- public class TestReflection02 {
- public static void main(String[] a) throws Exception{
- User p1 = new User("张三",18);
- TestReflection02 t = new TestReflection02();
- System.out.println("----------------------------------------");
- t.mf1(p1,"name","李四");
- t.mf1(p1,"age",30);
- System.out.println(p1);
- System.out.println("----------------------------------------");
- t.mf2("p2.User", "total",88);
- System.out.println("----------------------------------------");
- Class[] argTypes = {String.class,int.class};
- Object[] args = new Object[]{"王五",99};
- t.mf3(p1, "setAll",argTypes,args);
- System.out.println(p1);
- System.out.println("----------------------------------------");
- t.mf4("p2.User", "showTotal",null,null);
- }
- //直接操作对象属性
- public void mf1(Object o,String fieldName,Object newValue) throws NoSuchFieldException, IllegalAccessException {
- Class c = o.getClass(); //Class.forname("p2.User")
- //获取对象的属性引用
- Field f = c.getField(fieldName);
- //获取指定对象的属性值
- Object fv = f.get(o);
- System.out.print("修改前:" + fieldName + "=" + fv);
- //设置指定对象的属性值
- f.set(o,newValue);
- System.out.println("\t修改后:" + fieldName + "=" + f.get(o));
- }
- //直接操作类属性
- public void mf2(String className,String fieldName,Object newValue) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
- Class c = Class.forName(className);
- Field f = c.getField(fieldName);
- Object fv = f.get(c);
- System.out.print("修改前:" + fieldName + "=" + fv);
- f.set(c,newValue);
- System.out.println("\t修改后:" + fieldName + "=" + f.get(c));
- }
- //调用对象成员方法
- public void mf3(Object o,String methodName,Class[]argTypes,Object[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
- Class c = o.getClass();
- Method m = c.getMethod(methodName, argTypes);
- Object result = m.invoke(o, args);
- System.out.println(result);
- }
- //调用类成员方法
- public void mf4(String className,String methodName,Class[]argTypes,Object[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
- Class c = Class.forName(className);
- Method m = c.getMethod(methodName, argTypes);
- Object result = m.invoke(null, args);
- System.out.println("result:" + result);
- }
- }
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import p2.User; @SuppressWarnings("unchecked") public class TestReflection02 { public static void main(String[] a) throws Exception{ User p1 = new User("张三",18); TestReflection02 t = new TestReflection02(); System.out.println("----------------------------------------"); t.mf1(p1,"name","李四"); t.mf1(p1,"age",30); System.out.println(p1); System.out.println("----------------------------------------"); t.mf2("p2.User", "total",88); System.out.println("----------------------------------------"); Class[] argTypes = {String.class,int.class}; Object[] args = new Object[]{"王五",99}; t.mf3(p1, "setAll",argTypes,args); System.out.println(p1); System.out.println("----------------------------------------"); t.mf4("p2.User", "showTotal",null,null); } //直接操作对象属性 public void mf1(Object o,String fieldName,Object newValue) throws NoSuchFieldException, IllegalAccessException { Class c = o.getClass(); //Class.forname("p2.User") //获取对象的属性引用 Field f = c.getField(fieldName); //获取指定对象的属性值 Object fv = f.get(o); System.out.print("修改前:" + fieldName + "=" + fv); //设置指定对象的属性值 f.set(o,newValue); System.out.println("\t修改后:" + fieldName + "=" + f.get(o)); } //直接操作类属性 public void mf2(String className,String fieldName,Object newValue) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { Class c = Class.forName(className); Field f = c.getField(fieldName); Object fv = f.get(c); System.out.print("修改前:" + fieldName + "=" + fv); f.set(c,newValue); System.out.println("\t修改后:" + fieldName + "=" + f.get(c)); } //调用对象成员方法 public void mf3(Object o,String methodName,Class[]argTypes,Object[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { Class c = o.getClass(); Method m = c.getMethod(methodName, argTypes); Object result = m.invoke(o, args); System.out.println(result); } //调用类成员方法 public void mf4(String className,String methodName,Class[]argTypes,Object[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Class c = Class.forName(className); Method m = c.getMethod(methodName, argTypes); Object result = m.invoke(null, args); System.out.println("result:" + result); } }
- import java.lang.reflect.*;
- @SuppressWarnings("unchecked")
- public class TestReflection03 {
- public static void main(String[] args) {
- Class c;
- try {
- c = Class.forName("p1.Person");
- //调用有参数的构造方法
- Class[] argTypes = {String.class,int.class};
- Constructor constructor = c.getConstructor(argTypes);
- Object obj = constructor.newInstance("中国",5000);
- System.out.println(obj);
- //调用无参构造方法1
- constructor = c.getConstructor();
- //constructor = c.getConstructor(new Class[0]);
- //constructor = c.getConstructor(null);
- obj = constructor.newInstance();
- System.out.println(obj);
- //调用无参构造方法2
- obj = c.newInstance();
- System.out.println(obj);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
import java.lang.reflect.*; @SuppressWarnings("unchecked") public class TestReflection03 { public static void main(String[] args) { Class c; try { c = Class.forName("p1.Person"); //调用有参数的构造方法 Class[] argTypes = {String.class,int.class}; Constructor constructor = c.getConstructor(argTypes); Object obj = constructor.newInstance("中国",5000); System.out.println(obj); //调用无参构造方法1 constructor = c.getConstructor(); //constructor = c.getConstructor(new Class[0]); //constructor = c.getConstructor(null); obj = constructor.newInstance(); System.out.println(obj); //调用无参构造方法2 obj = c.newInstance(); System.out.println(obj); } catch (Exception e) { e.printStackTrace(); } } }
- import java.lang.reflect.Array;
- import p1.Person;
- @SuppressWarnings("unchecked")
- public class TestReflection04 {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int[] records = {89,56,43,77,33};
- Person[] ps = {new Person("张三",18),
- new Person("李四",24),
- new Person("王五",30)
- };
- records = (int[])incrementArray(records);
- ps = (Person[])incrementArray(ps);
- list(records);
- list(ps);
- int[][] a = (int[][])Array.newInstance(int.class,2,3);
- System.out.println(a);
- }
- public static Object incrementArray(Object array){
- //返回数组中成员的数据类型
- Class elementType = array.getClass().getComponentType();
- int size = Array.getLength(array);
- Object newArray = Array.newInstance(elementType, size*2);
- for (int i = 0; i < size; i++) {
- Object o = Array.get(array, i);
- Array.set(newArray, i, o);
- }
- //System.arraycopy(array,0,newArray,0,size);
- return newArray;
- }
- public static void list(Object array){
- int size = Array.getLength(array);
- for (int i = 0; i < size; i++) {
- System.out.println(Array.get(array, i));
- }
- }
- }
import java.lang.reflect.Array; import p1.Person; @SuppressWarnings("unchecked") public class TestReflection04 { public static void main(String[] args) { // TODO Auto-generated method stub int[] records = {89,56,43,77,33}; Person[] ps = {new Person("张三",18), new Person("李四",24), new Person("王五",30) }; records = (int[])incrementArray(records); ps = (Person[])incrementArray(ps); list(records); list(ps); int[][] a = (int[][])Array.newInstance(int.class,2,3); System.out.println(a); } public static Object incrementArray(Object array){ //返回数组中成员的数据类型 Class elementType = array.getClass().getComponentType(); int size = Array.getLength(array); Object newArray = Array.newInstance(elementType, size*2); for (int i = 0; i < size; i++) { Object o = Array.get(array, i); Array.set(newArray, i, o); } //System.arraycopy(array,0,newArray,0,size); return newArray; } public static void list(Object array){ int size = Array.getLength(array); for (int i = 0; i < size; i++) { System.out.println(Array.get(array, i)); } } }
- import p5.Student;
- import java.io.*;
- import java.util.*;
- import java.lang.reflect.*;
- /**
- * 模拟JavaBean接受表单参数
- *
- */
- @SuppressWarnings("unchecked")
- public class TestReflection05 {
- private static Hashtable mySession ;
- static{
- mySession = new Hashtable();
- mySession.put("stu", new Student());
- }
- public static void main(String[] args) throws Exception{
- // 解析准备好的属性文件。属性文件就相当于接受的参数
- Properties ps = new Properties();
- FileReader fr = new FileReader("props.txt");
- //导入关联文件中的属性信息
- ps.load(fr);
- fr.close();
- Enumeration pnames = ps.propertyNames();
- while(pnames.hasMoreElements()){
- String pname = (String)pnames.nextElement();
- String pvalue = ps.getProperty(pname);
- TestReflection05.receiveParams("stu",pname,pvalue);
- }
- System.out.println(TestReflection05.mySession.get("stu"));
- }
- public static void receiveParams(String beanName,String propertyName,String propertyValue) throws Exception{
- //模拟获取一个javaBean对象
- Object o = mySession.get(beanName);
- Class c = o.getClass();
- String methodName = "set" + propertyName.substring(0,1).toUpperCase() + propertyName.substring(1);
- Method method = c.getMethod(methodName, java.lang.String.class);
- method.invoke(o, propertyValue);
- }
- }
import p5.Student; import java.io.*; import java.util.*; import java.lang.reflect.*; /** * 模拟JavaBean接受表单参数 * */ @SuppressWarnings("unchecked") public class TestReflection05 { private static Hashtable mySession ; static{ mySession = new Hashtable(); mySession.put("stu", new Student()); } public static void main(String[] args) throws Exception{ // 解析准备好的属性文件。属性文件就相当于接受的参数 Properties ps = new Properties(); FileReader fr = new FileReader("props.txt"); //导入关联文件中的属性信息 ps.load(fr); fr.close(); Enumeration pnames = ps.propertyNames(); while(pnames.hasMoreElements()){ String pname = (String)pnames.nextElement(); String pvalue = ps.getProperty(pname); TestReflection05.receiveParams("stu",pname,pvalue); } System.out.println(TestReflection05.mySession.get("stu")); } public static void receiveParams(String beanName,String propertyName,String propertyValue) throws Exception{ //模拟获取一个javaBean对象 Object o = mySession.get(beanName); Class c = o.getClass(); String methodName = "set" + propertyName.substring(0,1).toUpperCase() + propertyName.substring(1); Method method = c.getMethod(methodName, java.lang.String.class); method.invoke(o, propertyValue); } }
发表评论
-
resin3.1配置说明
2010-12-14 16:07 849<!-- Resin 3.1 配置文件. --> ... -
resion 2.x配置
2010-12-14 16:06 1164resion 2.x配置 1. <http h ... -
sqlserver 递归查询
2010-12-01 17:20 792WITH read_tree (id,department ... -
20个非常有用的Java程序片段
2010-08-31 22:58 1380下面是20个非常有用的Java程序片段,希望能对你有用。1. ... -
ajax post提交乱码
2010-08-10 17:28 15926月30日 jQuery ajax乱码问题解决 一、测试环 ... -
IE注册表设置安全项
2010-07-30 17:16 2254Windows安全设置之注册表项在IE4.0以上的版本中,IE ... -
AD、CA、SSL,绑定keystore
2010-04-12 22:37 2635本文原文出处:http://blog.csdn.net/fre ... -
理解REST软件架构(转)
2010-01-01 23:47 859一种思维方式影响了软件行业的发展。REST软件架构是当今世界上 ... -
数据整合_SP
2009-12-18 14:50 756CREATE OR REPLACE PACKAGE BODY ... -
屏蔽数据_SP
2009-12-18 14:46 742CREATE OR REPLACE PACKAGE BODY ... -
数据抽取_SP
2009-12-18 14:44 925CREATE OR REPLACE PACKAGE BODY ... -
合并清洗
2009-12-18 14:41 738CREATE OR REPLACE PACKAGE BODY ... -
数据清洗_sp
2009-12-18 14:39 759CREATE OR REPLACE PACKAGE BODY ... -
test_help_sp
2009-12-18 08:24 713CREATE OR REPLACE PACKAGE BODY ... -
数据清洗2
2009-12-18 08:23 809create or replace package body ... -
数据清洗3
2009-12-18 08:22 817CREATE OR REPLACE PACKAGE BODY ... -
dwr reverse-ajax 实例解析(初步认识)
2009-10-30 15:20 1035在网上找了一个老外写的dwr reverse-ajax的例子 ... -
oracle sql
2009-09-23 10:29 628select * from PDS_DELIVERY_REQU ... -
开闭原则 思考(转)
2009-09-17 12:56 853开闭原则的定义 Software entities shou ... -
oracle函数
2009-09-16 23:38 1024oracle时间函数 相信很多人都有过统计某些数据的经历,比 ...
相关推荐
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...
在本文中,我们将深入探讨如何使用Java反射来获取并执行某个特定的方法。 首先,我们需要了解Java反射的基本概念。`java.lang.Class`类是反射的核心,它代表了Java中的每一个类。我们可以通过以下方式获取到一个...
### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...
### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...
Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...
Java反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。这个能力使得开发者可以突破静态类型的束缚,实现一些在编译时期无法完成...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...
### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...
### Java反射机制与NoSuchMethodException详解 在Java编程中,反射是一种强大的机制,允许程序在运行时检查和修改自身结构和行为。然而,当开发者尝试使用反射调用一个不存在的方法时,便会遇到`java.lang....
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON...
### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...