- 浏览: 352774 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (160)
- webservice (2)
- 数据库开发 (9)
- LINUX (6)
- 团队协作 (5)
- 前端技术 (4)
- J2EE (31)
- web服务器 (9)
- 经验常识 (12)
- 开发工具 (17)
- 项目管理 (7)
- 重构与设计模式 (8)
- 安全技术 (1)
- 并发编程 (1)
- 移动互联网 (2)
- 编码风格 (1)
- 领域建模 (1)
- 随想杂记 (12)
- 翻译 (2)
- 问题排查 (2)
- 数据挖掘 (4)
- 软件架构 (1)
- java语言基础知识 (13)
- 文件读写 (1)
- mac研发笔记 (1)
- 网络问题 (1)
- python学习 (0)
- Java8新特性 (1)
- soft kes collections (1)
最新评论
-
cremains:
...
java8新特性学习笔记 -
bingyingao:
guooo 写道很好的总结,不知能否转载?可以,多谢关注
又四年了,再看如何快速融入一个新团队 -
guooo:
很好的总结,不知能否转载?
又四年了,再看如何快速融入一个新团队 -
omeweb:
又过了好几年了,有啥新感悟没有?
两年已过去,再看该如何快速融入新团队 -
kely39:
感谢楼主,问题已解决
包冲突问题的解决方法
反射基本概念:
在java运行时环境中,对于任意一个类,能够动态的获取类的信息,动态调用类的方法。
在运行期间:判断,构造,调用任意一个类的成员变量和方法。而在编译期间:我们是用new 创建java的对象。
通过reflection机制,我们可以在运行时取得任何一个已知名称的class的内部信息,包括其修饰符,以及superclass,interfaces,也包括fields和methods的所有信息。
在jdk中主要由以下类来实现java反射机制:
-class类,
-Field类,
-Mehtod类,
-Array类。
------------------
动态语言定义:程序运行时,允许改变程序结构或者变量类型,这种语言称为动态语言。从这个观点看,perl,python,ruby,javasacript是动态语言,c++,java,c#不是动态语言。但是java却有一个非常突出的动态相关机制,Reflection。
----------------------
1.要想使用反射,首先需要获得待处理类或对象的class对象
2.获取class的三种方法。
1)通过Class.forName("");
2)通过类.class,eg:string.class;
3)通过对象的 obj.getClass();
3.若想通过类的不带参数的构造方法生成对象,有两种方式:
a)先获得class对象,然后通过class对象的newInstance()方法直接生成即可
b)先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;Class<?> classType=StringBuffer.class;
Constructor cons=classType.getConstructor(new Class[]{});
Object obj=new cons.newInstance(new Object[]{});
4.若想通过类的带参数的构造方法生成对象,只有一个方法:
先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;Class<?> classType=StringBuffer.class;
Constructor cons=classType.getConstructor(new Class[String.class,int.class]{});
Object obj=new cons.newInstance(new Object[]{"abing",5});
5.通过反射可以调用一个对象的private方法,或者修改一对象的private属性。
用反射复制一个对象:
当然可以,写上来本来就是为了共享的
在java运行时环境中,对于任意一个类,能够动态的获取类的信息,动态调用类的方法。
在运行期间:判断,构造,调用任意一个类的成员变量和方法。而在编译期间:我们是用new 创建java的对象。
通过reflection机制,我们可以在运行时取得任何一个已知名称的class的内部信息,包括其修饰符,以及superclass,interfaces,也包括fields和methods的所有信息。
在jdk中主要由以下类来实现java反射机制:
-class类,
-Field类,
-Mehtod类,
-Array类。
------------------
动态语言定义:程序运行时,允许改变程序结构或者变量类型,这种语言称为动态语言。从这个观点看,perl,python,ruby,javasacript是动态语言,c++,java,c#不是动态语言。但是java却有一个非常突出的动态相关机制,Reflection。
----------------------
1.要想使用反射,首先需要获得待处理类或对象的class对象
2.获取class的三种方法。
1)通过Class.forName("");
2)通过类.class,eg:string.class;
3)通过对象的 obj.getClass();
3.若想通过类的不带参数的构造方法生成对象,有两种方式:
a)先获得class对象,然后通过class对象的newInstance()方法直接生成即可
b)先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;Class<?> classType=StringBuffer.class;
Constructor cons=classType.getConstructor(new Class[]{});
Object obj=new cons.newInstance(new Object[]{});
4.若想通过类的带参数的构造方法生成对象,只有一个方法:
先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;Class<?> classType=StringBuffer.class;
Constructor cons=classType.getConstructor(new Class[String.class,int.class]{});
Object obj=new cons.newInstance(new Object[]{"abing",5});
5.通过反射可以调用一个对象的private方法,或者修改一对象的private属性。
import java.lang.reflect.Field; import java.lang.reflect.Method; class User{ private String userName=""; public String getUserName() { return userName; } public int add(int a, int b) { return a + b; } private int minus(int a,int b) { return a-b; } } public class ReflectTest { /** * @param args */ public static void main(String[] args) throws Exception { Class<?> classType=Class.forName("User");//得到class对象 Method[] meth=classType.getDeclaredMethods();//得到该class所有声明method for (Method method : meth) { System.out.println("method:"+method); } Field [] fiel=classType.getDeclaredFields();//得到该class所有声明field for (Field field : fiel) { System.out.println("fiueld:"+field); } User user=(User)classType.newInstance();//通过class获得User对象 Method method=classType.getMethod("add",new Class<?>[]{int.class,int.class});//获取add方法,考虑到方法重载,还要加上参数条件才能唯一限定一个方法 int result=(Integer)method.invoke(user, new Object[]{3,9});//通过invoke调用方法 System.out.println("addresult:"+result); /** * 通过反射来访问方法的私有方法 */ Method methodminus=classType.getDeclaredMethod("minus",new Class<?>[]{int.class,int.class});//通过getDeclaredMethod取得私有的方法 methodminus.setAccessible(true);//将可访问性设置为true int resultminus=(Integer)methodminus.invoke(user, new Object[]{3,9});//通过invoke调用方法 System.out.println("resultminus:"+resultminus); /** * 通过反射来访问方法的私有属性 */ Field field=classType.getDeclaredField("userName"); field.setAccessible(true);//将可访问性设置为true field.set(user, "bingyingao");//给私有属性userName赋值 System.out.println(user.getUserName()); } }
用反射复制一个对象:
import java.lang.reflect.Method; class StudentPojo{ private String name; private String hometown; private int age; private boolean man; public StudentPojo() { // TODO Auto-generated constructor stub } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean getMan() { return man; } public void setMan(boolean man) { this.man = man; } public String getHometown() { return hometown; } public void setHometown(String hometown) { this.hometown = hometown; } } class Student{ private String name=""; private int age; private boolean man; private String hometown; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean getMan() { return man; } public void setMan(boolean man) { this.man = man; } public String getHometown() { return hometown; } public void setHometown(String hometown) { this.hometown = hometown; } } public class ReflectTest { /** * 通过反射复制一个对象 * @param sourceObject * @param targetObject */ private static void cpObject(Object sourceObject, Object targetObject){ Method[] methodArray = targetObject.getClass().getMethods(); for(Method method:methodArray){ String methodName = method.getName(); if(!(methodName.startsWith("set"))){ continue; } String newMethodName = "get"+methodName.substring(3); Method newMethod; try { newMethod = sourceObject.getClass().getMethod(newMethodName); Object value = newMethod.invoke(sourceObject, null); if(null == value || "".equals(value)){ continue; } method.invoke(targetObject, value); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { StudentPojo student=new StudentPojo(); student.setName("阿丙"); student.setAge(25); student.setMan(true); student.setHometown("xiangyang"); Student student2=new Student(); cpObject(student,student2); System.out.println(student2.getName()+":"+student2.getAge()+":"+student2.getMan()+":"+student2.getHometown()); } }
评论
4 楼
onepiece2345
2012-11-30
发现了一个问题,就是在用无参的构造方法创建对象时
b)先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;
Constructor cons=classType.getConstructor(new Class[]{});
应该是classType.getDeclaredConstructor(new Class[]{});
不然不能运行,找不到构造方法,getConstructor获取不到任何构造方法
下面通过有参构造方法一样是这样的错误。
b)先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;
Constructor cons=classType.getConstructor(new Class[]{});
应该是classType.getDeclaredConstructor(new Class[]{});
不然不能运行,找不到构造方法,getConstructor获取不到任何构造方法
下面通过有参构造方法一样是这样的错误。
3 楼
bingyingao
2012-11-29
onepiece2345 写道
我想转载你的这篇文章,可否?会注明出处的
当然可以,写上来本来就是为了共享的
2 楼
onepiece2345
2012-11-29
我先转了哈,你不愿意的话,告我一声我再删掉,呵呵
1 楼
onepiece2345
2012-11-29
我想转载你的这篇文章,可否?会注明出处的
发表评论
-
log4j关键点
2013-09-25 19:43 1065日志级别 级别顺序(低到高): DEBUG < INFO ... -
java集合排序
2013-09-24 19:18 1120java对象集合排序在开发中使用非常广泛,需要重点理解,而它实 ... -
关于java.lang.OutOfMemoryError的参数配置误区
2013-09-10 15:10 1127这两天在本机用eclipse的jetty插件跑项目,老是抛出一 ... -
spring这样的来配置一些常量很方便
2013-09-03 09:48 2498<util:list id="haidilao ... -
快速查找线程死锁(展苍)
2012-12-23 13:25 0Thread dump Thread dump是比较容易查找 ... -
javap查看虚拟机为你做了什么
2012-12-02 15:38 560public class Test { publi ... -
javaweb开发乱码问题整理
2012-03-15 14:01 1000j2ee方面的开发总会遇到各种各样的乱码问题,总想抽空整理一下 ... -
用正则表达式扣出字符串中指定的多处内容
2011-12-26 15:29 1452截取打印出所有<record></recor ... -
java匿名内部类使用场景列举
2011-11-18 10:57 2617java内部类是怎么一回事?匿名内部类何时会用到,之前一直很模 ... -
使用UUID生成32位ID
2011-11-14 11:11 21328UUID(Universally Unique Identif ... -
java数据类型介绍
2011-11-09 14:34 958java数据类型介绍 简单类型大小范围/精度 ... -
Exception点滴
2011-11-08 14:24 948java.lang.reflect.UndeclaredThr ... -
将set集合转为list并对对象进行排序
2011-11-06 15:09 7745之前用hibernate的时候,遇到一对多的表结构。比如班级( ... -
src地址为空导致两次进入到action请求地址
2011-10-29 13:05 1532今天用struts开发一个页面,奇怪的是我点了一次提交,达到目 ... -
struts标签与ognl表达式用法点滴
2011-10-27 18:43 1406struts标签的使用中,会涉及一些比较细的点儿,汇总一下,以 ... -
struts2第四回:工作流程解析
2011-10-14 15:18 877这两天没什么任务,就想研究一下struts2的源码,看了半天, ... -
struts2第三回:自定以拦截器
2011-10-13 19:14 1099实现一个拦截器并调用。 ============下面是Logi ... -
struts2第二回:防止重复提交
2011-10-13 18:51 2268基本原理:用户访问做了重复提交的页面,服务器会生成一个令牌,这 ... -
include与jsp:include与s:action与s:include与iframe用法汇总
2011-10-13 13:47 207171.<%@ include file="../ ... -
struts2第一回:validate框架使用
2011-10-12 16:42 5040struts2总结 ...
相关推荐
这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...
在"JAVA反射机制学习"资料中,你将深入理解这一关键概念。 首先,我们要明白什么是反射。在Java中,反射是一种在运行时分析类、接口、字段和方法的能力。通过使用`java.lang.Class`对象,我们可以获取任何类的信息...
在本篇“java反射机制学习(五):工厂模式”中,我们将探讨如何利用反射与工厂模式结合,提升代码的灵活性和可扩展性。 首先,工厂模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。传统的工厂模式...
Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...
总结来说,Java反射机制是Java语言的一个重要特性,它使得程序能够在运行时动态地获取类的信息并进行操作,提高了代码的通用性和适应性。在实际开发中,反射机制常用于框架设计、插件系统、数据持久化等领域,但同时...
Java反射机制是Java编程语言的一项重要特性,它允许程序在运行时动态地获取类的信息,并且能够对类的属性和方法进行操作。反射机制的核心在于Java的`java.lang.reflect`包,其中包含了`Class`、`Constructor`、`...
Java反射机制是Java编程语言中一个强大的特性,它允许运行时动态地获取类的信息并进行操作,如创建对象、调用方法、访问属性以及处理数组等。在本篇讲解中,我们将深入理解如何通过反射来执行方法、操作属性以及处理...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这种能力使得Java具备了高度的灵活性和动态性,尤其是在处理未知类或者需要在运行时决定行为的情况下。以下...
通过本文的学习,我们深入了解了Java反射机制的基本概念、原理以及应用。Java反射机制为Java程序提供了一种强大的动态处理能力,使得Java不仅仅局限于静态类型语言的功能限制。掌握Java反射机制对于开发者来说是非常...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本教程中,我们将深入探讨如何通过反射获取实体类的属性、方法、接口以及父类信息。 首先,让...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本篇文章中,我们将深入探讨如何通过反射获取构造方法并实例化对象,这对于理解和使用Java的...
Java反射机制是Java语言中一个强大的工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在动态代理部分,我们将探讨如何利用反射机制实现动态代理,这在处理面向切面编程(AOP)或者为已...
Java反射机制是Java编程语言中的一项核心特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够在编译后仍然能够灵活地处理类和对象,增强了代码的动态性。在Android应用开发中,反射机制尤其重要...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制对于理解和实现高级框架、动态代理、元数据处理等场景至关重要。以下是对Java反射机制的详细说明:...
在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念:在程序运行时,通过Class对象获取类的信息,包括类名、属性、方法等,并能够动态地创建对象和调用方法。...
总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...
Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中...在实践中学习,你会更好地理解Java反射机制的威力和应用场景。
Java反射机制是Java编程语言中的一个强大特性,...通过学习和实践Java反射机制,你可以更深入地理解Java的运行机制,并在需要动态性、灵活性的场景中发挥其强大的功能。不过,使用反射时也应注意潜在的风险和性能影响。
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...