- 浏览: 43796 次
- 性别:
文章分类
最新评论
本文转自:http://zk1878.iteye.com/blog/922056
一、java中生成对象的方式,本人所能想到的有以下几种(以 com.knight.Employer为例)
1、使用new方式,这每个javaer都会的
Employer e=new Employer();
2、使用克隆方式(clone),此方式要求Employer实现cloneable接口
Employer e2=(Employer)e1.clone();
3、序列化方式,此方式要求Employer实现Serializable接口
ObjectInputStream objIn=new ObjectInputStream(in);//in为InputStream实例
Employer e=(Employer)objIn.readObject();
4、反射
反射可以有很多变体,通常有以下几种
Class c=Class.forName("com.knight.Employer");
Employer e= (Employer)c.newInstance();
或者
ClassLoader loader=Huma.class.getClassLoader();
Class c=loader.loadClass("com.knight.Employer");
Employer e= (Employer)c.newInstance();
此两种方式都要求Employer有公有无参构造函数。
还有另外一种通过Constructor进行构造,以下详述
5、直接操作字节码,这种方式需要对class文件及虚拟机机制有深刻理解,不是一般的难
二、java反射api简介
以下与Huma类为例
package com.knight.test;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.lang.reflect.Constructor;
public class Huma {
public String name;
private int age;
private void log(){
System.out.println("log invoke");
}
public Huma() {
}
public Huma(String name,int age) {
this.name=name;
this.age=age;
}
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;
}
}
java中反射机制主要使用以下几个类
Class,Constructor,Field,Method,AccessibleObject
1、Class的用法
Class可以获取关于类中所有方法,属性的信息
Field[] getFields()//获取Huma中声明的公有属性,包括从父类继承的
Field[] getDeclaredFields()//获取Huma中声明所有属性(包括私有属性),但不包含任何父类继承的属性
注意有无declared的区别,以下不在罗嗦
Field getField(String name)//获取名称为name的属性
以此类似,Class可以获取其对于的Constructor,Method信息
再举一个方法
Method getDeclaredMethod(String name, Class<?>... parameterTypes);此方法获取成员函数名字为name,函数的参数类型为Class<?>... parameterTypes的函数,其中parameterTypes为null或者为空数组时,表示该函数没有形参
public Object newInstance() //生成该类的一个对象,需有无参构造函数
public static Class forName(String className)//生成className指定的类的Class实例
2、AccessibleObject
AccessibleObject是一个接口,Constructor,Field,Method均实现了该接口
public void setAccessible(boolean flag);该方法设置可访问性,在类的成员为私有的情况下
设置flat为true将可以通过反射修改成员的值,否则会发生异常
3、Field类
public Object get(Object o);获取该Field实例对应对象o的Field的值
public void set(Object obj, Object value) ;设置该Field对应的对象obj的Field属性的值为value
3、Method类
Class<?>[] getParameterTypes() ;返回该Method的形参类型,按声明顺序
Class<?> getReturnType() ;返回该Method的返回类型
Class<?>[] getExceptionTypes() ;返回该Method声明抛出的异常
Object invoke(Object obj, Object... args) ;执行该Method,obj是该Method所属对象的一个实例
//args是一个对象数组,表示该Method参数数组实参
其中args为null或者为空数组时,表示该函数没形参,当obj为null时,表示该函数为静态方法
4、Constructor类
Class<T> getDeclaringClass();返回该Constructor所表示的Class对象
Class<?>[] getParameterTypes() ;返回该Constructor表示的形参类型数组
T newInstance(Object... initargs) ;生成该Constructor表示的对象的一个实例,initargs为形参数组
三、例子
// 生成Huma实例(带参数)
Constructor c=Huma.class.getDeclaredConstructor(new Class[]{String.class,int.class});
Huma huma=c.newInstance(new Object[]{"zhang san",18});
//获取Field,并改变其值
Field nameField=Huma.class.getField("zhangsan");
nameField.setsetAccessible(true);//注意name属性私有,所以在这里调用,参数为true
nameField.set("lisi");//此时name已经变为lisi了,上一句不调用的的话,此句将抛出异常
//获取方法并调用
Method methodSetName=Huma.class.getMethod("setName",new Class[]{String.class});
methodSetName.invoke(huma,new Object[]{"wangwu"});//相当于 huma.setName("wangwu");
最后需要注意的地方就是 反射生成的类,修饰符应该是public的,否则,在其他地方调用时可能会出现问题
,例如 在一个 com.abc.Test的main方法中调用 Class.forName("com.knight.Huma"),并且Huma的修饰符不是public时,将抛出异常
发表评论
-
【J2SE】Map.Entry 类使用简介
2012-05-10 11:12 494本文转自:http://www.cnblogs.com/guo ... -
【J2SE】Static Nested Class、Inner Class、Anonymous Inner Class
2012-05-05 11:58 0本文转自:http://blog.csdn.net/welco ... -
【J2SE】Anonymous Inner Class (匿名内部类)
2012-05-05 11:56 0本文转自:http://www.iteye ... -
【J2SE】生成者、消费者问题
2012-05-05 11:04 822本文转自:《Java JDK 实例宝典》 解决生产者消费者问 ... -
【J2SE】Java 运行时异常
2012-05-05 10:39 0本文转自:http://amyer.ite ... -
【J2SE】再谈线程:生产者与消费者
2012-05-04 23:36 0本文转自:http://www.blogjava.net/li ... -
【J2SE】Java线程:并发协作-生产者消费者模型
2012-05-04 23:34 0本文转自:http://lavasoft.blog.51cto ... -
【J2SE】线程7种状态的相互转换
2012-05-04 22:48 666本文转自:http://www.blogj ... -
【J2SE】详解java类的生命周期
2012-05-12 21:23 657本文转自:http://www.2cto.com/kf/20 ... -
Java文件操作大全
2012-05-02 13:29 0本文转自:http://www.blog ... -
【基础】Java Annotation详解
2012-05-02 11:50 0本文转自:http://www.blogjava.net/c ... -
【J2SE】Java JDBC数据库连接池总结
2012-05-03 23:21 868本文转自:http://www.blogj ... -
【基础】JAVA中String与StringBuffer的区别
2012-05-01 20:28 0String和StringBuffer的区别,网上资料可以说是 ... -
【J2SE】Java常见异常小结
2012-05-12 21:22 750本文重在Java中异常机制 ... -
【基础】Java异常处理及异常机制介绍
2012-05-01 19:54 0当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内 ... -
【基础】Java中finalize()
2012-05-01 19:39 0垃圾回收器要回收对象的时候,首先要调用这个类的finalize ... -
【基础】finally的一些测试
2012-05-01 16:37 0finally是在执行returen的中间执行。 pac ... -
【J2SE】Java之Path、CLASSPATH的概念解析
2012-05-03 23:17 772本文转自:http://blog.sin ... -
【J2SE】Java中生成对象的4方式
2012-05-01 12:46 0本文转自:http://blog.sina.com.cn/s/ ... -
【J2SE】Anonymous Inner Class 匿名内部类
2012-04-27 19:05 745本文转自: public class T ...
相关推荐
J2SE的反射机制高级应用J2SE的反射机制高级应用J2SE的反射机制高级应用J2SE的反射机制高级应用
java反射机制的一些源代码,我学习的笔记,需要的可以下载看看
(J2SE平台Java程序设计)阶段测试题,(J2SE平台Java程序设计)阶段测试题,(J2SE平台Java程序设计)阶段测试题,(J2SE平台Java程序设计)阶段测试题
java学习总结1 -- j2se 项目环境: jdk8 字符集:UTF-8 开发工具:Eclipse 包括内容: basic 基本语法 oop 面向对象 api 常用api及工具类 javadoc javaDoc的使用 debug 代码调试方法 datastructure 基本数据结构 ...
Java j2se QQ 毕业论文
java 入门教程 课件 j2se java 入门教程 课件 j2se java 入门教程 课件 j2se java 入门教程 课件 j2se
java基础(j2se代码)java基础(j2se代码)java基础(j2se代码)java基础(j2se代码)java基础(j2se代码)java基础(j2se代码)java基础(j2se代码)
实验1 JAVA开发环境J2SE实验报告.doc
如何才算掌握Java(J2SE篇 如何才算掌握Java(J2SE篇
5 JAVA反射机制 6 JAVA注解(ANNOTATION) 7 JAVA中的异常类 8 JAVA-SWING 9 观察者模式 10 内部类讲解 11 JAVA I/O流讲解 12 JAVA多线程 13 JAVA网络通信 14 JAVA类加载器CLASSLOADER 15 JAVA简单工厂...
j2se 非常好的java基础知识整理
Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记
尚学堂马士兵j2se课程的全部源代码,针对每章知识点的小例题
内容概要:华为牛客网的Java测试题,算法测试题的第一页的解题源码 使用人群:应届毕业生 在校大学生 初级中级高级开发 适用场景及目标:借鉴 参考,有些算法还是有价值,都是一个一个字母敲出来的 其他:只代表个人...
其中有Java源代码,还有发布的程序,点击直接即可运行。对于J2SE的学习非常有帮助。
J2SE_Java_Api是j2se开发使用的api
资源名称:Java-J2se、J2ee开发全程视频教程和源码(87集)资源目录:【】Java-J2se-J2ee全程教程(01-10)【】Java-J2se-J2ee全程教程(11-20)【】Java-J2se-J2ee全程教程(21-30)【】Java-J2se-J2ee全程教程(31...
是myeclipse课本源码,里面有详细的注解。希望能给大家带来帮助
java初学者很好的学习指南...从J2SE到JAVA EE一系列的学习过程,有很好的引导作用...
JAVA参考大全.J2SE