- 浏览: 45206 次
- 性别:
文章分类
最新评论
本文转自: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 519本文转自: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 837本文转自:《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 680本文转自:http://www.blogj ... -
【J2SE】详解java类的生命周期
2012-05-12 21:23 679本文转自: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 890本文转自:http://www.blogj ... -
【基础】JAVA中String与StringBuffer的区别
2012-05-01 20:28 0String和StringBuffer的区别,网上资料可以说是 ... -
【J2SE】Java常见异常小结
2012-05-12 21:22 825本文重在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 791本文转自: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 766本文转自: public class T ...
相关推荐
J2SE的反射机制高级应用J2SE的反射机制高级应用J2SE的反射机制高级应用J2SE的反射机制高级应用
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者能够在运行时动态地获取类的信息(如类名、方法名、参数类型)并调用方法,创建对象,甚至...
J2SE,即Java 2 Platform, Standard Edition,是Java平台的核心部分,主要针对桌面应用和服务器端应用程序的开发。 J2SE Java Api包含了Java语言的基础库,这些库覆盖了从基本数据类型操作、内存管理(垃圾回收)到...
Java J2SE(Java Standard Edition)是Java平台的标准版,它是Java开发工具集的一个子集,主要用于桌面应用程序的开发。本毕业论文将深入探讨如何利用Java J2SE技术来实现一个QQ类似的即时通讯软件,这涉及到Java...
java学习总结1 -- j2se 项目环境: jdk8 字符集:UTF-8 开发工具:Eclipse 包括内容: basic 基本语法 oop 面向对象 api 常用api及工具类 javadoc javaDoc的使用 debug 代码调试方法 datastructure 基本数据结构 ...
JAVA开发环境J2SE实验报告 在本实验中,我们将学习和掌握JAVA开发环境J2SE的基本概念和使用方法。具体来说,我们将学习如何下载和安装J2SE开发工具,熟悉J2SE开发工具的使用,编写简单的Java Application和Java ...
Java J2SE(Java 2 Platform, Standard Edition)是Java平台的核心部分,它提供了用于开发和部署桌面应用程序的API和运行环境。这个平台包含了Java语言的基础类库,如集合、多线程、网络编程、I/O操作等核心功能。在...
最后,Java标准版还包含许多其他重要模块,如反射、JNI(Java Native Interface)以及Java的国际化和本地化支持。这些高级特性可以帮助你实现更复杂的功能,比如动态加载类、调用C/C++库等。 马士兵老师的J2SE课程...
10. **反射**:J2SE的反射机制允许程序在运行时检查类、接口、字段和方法的信息,动态创建对象并调用方法,增强了程序的灵活性。 11. **JNI(Java Native Interface)**:允许Java代码调用本地(非Java)代码,实现...
以上几个题目覆盖了Java语言的基础知识,包括程序结构、编译流程、构造函数的使用、方法重载、基本数据类型的运算以及垃圾回收机制。这些知识点对于初学者来说非常重要,能够帮助他们更好地理解和掌握Java编程语言的...
Java反射机制允许在运行时动态地获取类的信息并操作类的对象。这在插件系统、序列化、动态代理等方面有广泛应用。 八、Java虚拟机(JVM) 了解JVM的工作原理,包括类加载机制、内存模型、垃圾回收等,有助于优化...
《基于Java的J2SE公交查询系统详解》 在当今信息化社会,公共交通查询系统的便捷性对公众出行至关重要。本文将详细介绍一个基于Java Standard Edition (J2SE) 的静态公交信息查询系统,它为用户提供了简单易用的...
这通常涉及到对Java异常处理机制的理解,以及如何使用调试工具来查找问题根源。 #### 八、思想 掌握面向对象编程(OOP)的思想对于编写高质量的Java程序至关重要。这意味着: - 封装:将数据和操作数据的方法封装...
8. **反射机制**:理解Java的反射机制,如何在运行时动态获取类信息,创建对象,调用方法,修改字段值。 9. **枚举和注解**:学习枚举类型,用于定义有限的常量集合。理解注解(Annotation)的作用,以及元注解和...
Java 2 Standard Edition (J2SE) 是Java平台的核心组件,用于开发和部署桌面应用程序。这个实例集合提供了丰富的Java源代码示例,可以帮助学习者深入理解J2SE的各种特性和功能。通过这些实例,你可以了解到如何在...
文档涵盖了诸如集合框架、多线程、I/O流、网络编程、反射机制、异常处理、数据库连接(JDBC)、XML处理等关键主题。中文版使得国内开发者可以更方便地学习和查阅,避免了语言障碍,提高学习效率。 《java api1.6中文...
j2se 非常好的java基础知识整理
6. **反射机制**:Java的反射API允许程序在运行时动态访问和修改类的信息,如创建对象、调用方法、访问字段等。 7. **设计模式**:常见的设计模式如单例、工厂、观察者、装饰者、代理等,这些模式在实际开发中经常...
在J2SE(Java Platform, Standard Edition)环境中,开发者可以使用JMS来创建发送和接收消息的应用程序,实现解耦、可靠的数据传输以及高效的资源管理。JMS允许应用程序在不直接相互交互的情况下交换信息,从而提高...
Java记事本是一款基于J2SE(Java 2 Standard Edition)平台开发的简单文本编辑器,它实现了类似于系统记事本的基本功能,如新建、打开、保存、复制、粘贴、剪切、查找、替换等。这个项目是Java初学者进行Swing图形...