- 浏览: 579512 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (200)
- html css (6)
- javascript (11)
- php (6)
- java基础 (18)
- mysql (8)
- ssh (7)
- linux (21)
- 杂想 (1)
- 搜索引擎 (2)
- linux-shell (2)
- perl (61)
- 单元测试 (1)
- jquery (1)
- xml (1)
- 求职招聘 (1)
- 其他 (2)
- 项目工具 (2)
- maven (10)
- ant (1)
- eclipse (3)
- windows (4)
- java (8)
- jsp (1)
- c c++ (7)
- java-web (3)
- 汇编 (1)
- 正则表达式 (2)
- 网络 (1)
- 路由 (1)
- ip (1)
- 测试驱动开发 (1)
- tdd (1)
- vim (1)
- powermock (1)
- junit (1)
- spring (1)
- spring security (1)
- httpclient (1)
- sql (1)
- sqlserver (2)
- 存储过程 (1)
- apache (1)
- Nexus (1)
- 金融 (1)
- clojure (4)
- 函数式编程 (3)
- 工作 (1)
- git (2)
- java 并发 (1)
- python (1)
- java netty proxy (1)
- scala (1)
最新评论
-
springmvc-freemarker:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 配置maven web项目 -
zk1878:
huzhenyu 写道楼主很用心,讲得十分清楚,非常实用!呵呵 ...
eclipse 配置maven web项目 -
huzhenyu:
楼主很用心,讲得十分清楚,非常实用!
eclipse 配置maven web项目 -
宋建勇:
不错,对CountDownLatch了解加深了!
java 多线程 CountDownLatch用法 -
zk1878:
必须的。。。。
perl下载图片
一、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时,将抛出异常
发表评论
-
java web spring xsd 从 classpath加载
2014-10-04 18:11 11420spring中的配置文件定义的 dtd,xsd等文件默认是从 ... -
java 使用xsl 将xml 转换为 html
2011-12-16 16:16 3009原文:http://www.rgagnon.com/javad ... -
java nio 的一个简单例子:拷贝文件
2011-11-18 16:32 3520下面是java中的nio一个例子,拷贝文件 通过 ... -
以小见大,一段简单的多线程代码
2011-11-01 14:54 1688下面是一段简单的ja ... -
Java NIO原理和使用
2011-10-31 16:52 1174原文:http://www.jspcn.net/h ... -
在 Linux 平台下使用 JNI-转
2011-10-14 16:30 930原文:http://www.ibm.com/dev ... -
java国际化基础
2011-08-26 14:02 1436java国际化主要涉及2个 ... -
java中一些基础却又非常重要,容易忽略的小知识
2011-06-23 21:29 1173java基础非常重要,最近一段时间面试碰到的问题,现在做了个总 ... -
java理论与实践:流行的原子
2011-04-25 17:30 1071原文:https://www.ibm.com/develope ... -
ReadWriteLock用法
2011-04-16 18:56 18549对象的方法中一旦加入synchronized修饰 ... -
对资源的许可访问 Semaphore用法小例
2011-04-14 13:09 1495Semaphore 通常用于限制可以访问某些资源(物理或逻辑的 ... -
java 多线程 CountDownLatch用法
2011-04-14 11:13 15623CountDownLatch,一个同步辅助类,在完成一组正在其 ... -
JTable的列宽与内容的自适应--转
2011-03-14 23:16 4927JTable的列宽与内容的自适应JTable默认的各列宽度平均 ... -
java监听组合键
2011-03-14 22:41 1410监听普通ctrl+c的代码 public void keyP ... -
java日期加减运算-转
2011-03-14 11:42 1414原文链接 http://www.blogjava.net/wi ... -
java classloader动态加载类
2011-02-24 23:18 4391一般的class都是由系统 ... -
自己写的一个beanutil,超简单,超实用
2011-02-24 13:11 1754自己写的一个beanutil,支持动态调用,主要运用了反射,代 ...
相关推荐
总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...
Java SE编程入门教程涵盖了许多Java基础知识,其中包括对Java反射机制的讲解。反射是Java中一个强大的功能,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够实现一些灵活的功能,如动态加载类、...
Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、...通过深入理解和熟练运用Java反射机制,开发者可以编写出更加灵活、可扩展的代码,但同时也需要谨慎处理反射可能带来的性能和安全问题。
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象的内部细节。Java反射机制的核心在于`java.lang.Class`类,它代表着程序中的每一个类,提供了访问类信息的...
学习Java反射机制,你需要理解并掌握这些类的使用,同时要明白,虽然反射提供很大的灵活性,但也带来了性能开销和安全风险,因此在实际开发中应谨慎使用。在自学或教学过程中,第13章的Java反射机制课件会深入讲解...
### Java反射机制详解 #### 引言 Java反射机制,作为Java语言动态特性的核心,赋予了Java在运行时分析和操作类的...总之,Java反射机制是理解Java动态特性的关键,掌握它能够极大地提升开发者解决问题的能力和效率。
Java反射机制为开发者提供了强大的能力,可以动态加载类、创建对象、访问私有成员、处理泛型等。然而,反射也可能会降低程序的性能,并且可能导致安全问题,因此在使用时需要谨慎。在理解了这些基本概念后,你可以...
【Java反射机制详解】 在Java编程中,反射机制是一个强大的工具,它允许程序在运行时检查自身,并且能够动态地操作类和对象的内部信息。这个特性使得Java代码具有高度的灵活性,能够在不修改源码的情况下,根据需要...
这篇博文将带你入门Java反射,并通过属性和方法的调用来实践这一概念。 首先,理解反射的基础概念。在Java中,`Class`类代表了运行时的类信息。通过`Class`对象,我们可以获取到类的名称、构造器、方法和字段。例如...
最后,PPT可能还介绍了Java的高级话题,如反射、注解、泛型和设计模式。这些内容有助于提升你的编程技巧,使你能更好地应对复杂项目的需求。 总的来说,“java从入门到精通PPT”提供了一个全面的学习路线,从基础到...
在Java基础入门四泛型、反射、注解的学习中,我们会了解到如何正确使用泛型来创建更加健壮的代码,如何利用反射机制实现类和对象的动态操作,以及如何利用注解来简化开发过程和提高代码的可读性。 此外,文档中提到...
12. **反射**:反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能动态创建对象和调用方法。 13. **注解(Annotation)**:注解是元数据的一种形式,提供了一种安全的方式向编译器和JVM传递信息,用于...
7. **反射机制**:Java反射机制允许在运行时动态访问类的信息,如类名、方法名、参数类型等,从而实现动态加载类、调用方法等功能。这对于理解和编写工具类或插件化系统非常有用。 8. **JVM原理**:理解Java虚拟机...
Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。本文将详细介绍Java反射的基础知识,包括反射的基本概念、工作原理、使用方法及优缺点。 1. 反射的基本...
9. **反射机制**:如何在运行时动态获取类的信息,创建和调用类的对象。 10. **标准库应用**:如使用Math类进行数学计算,日期时间API,网络编程的Socket类等。 通过阅读这些源码并动手实践,学习者不仅能掌握Java...
12. **反射与注解**:讲解Java反射机制,如何动态访问和修改类、接口、方法,以及注解的使用和自定义注解的创建。 13. **Java高级特性**:如模块化系统(Project Jigsaw)、Optional类、并发工具类(如...
如异常处理、集合框架(ArrayList、LinkedList、HashMap等)、IO流(用于文件读写和网络通信)、多线程编程(线程同步、线程池)、反射机制、设计模式(如单例模式、工厂模式、观察者模式等)以及Java的高级API,如...
以下是对"Java反射入门"这一主题的详细解释。 1. **什么是反射**: 在Java中,反射是指程序在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和...
7. **Java高级特性**:涵盖反射、动态代理、注解、枚举等Java的高级特性和应用场景。 8. **Java EE**:如果光盘内容涉及,可能会介绍Java企业级应用开发,如Servlet、JSP、JDBC数据库访问、EJB等技术。 9. **实战...
反射机制允许程序在运行时检查和操作类、接口、字段和方法,是实现动态代理、插件化等高级功能的基础。除此之外,Java的泛型、枚举、注解等特性也会被详尽阐述,这些都能提高代码的可读性和复用性。 进一步深入,你...