- 浏览: 1541067 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (225)
- JAVA (27)
- Spring (49)
- Linux (51)
- JavaScript (8)
- Scrum (23)
- IDE (2)
- JSON (2)
- Solr (0)
- Webharvest (0)
- Hibernate (8)
- 杂谈 (3)
- Windows 7 (4)
- 持续集成 (23)
- tomcat (3)
- Android (1)
- SpringSecurity (11)
- Maven (9)
- jotm (3)
- C3P0 (1)
- Active Directory (2)
- cas (1)
- JQuery (2)
- ajax (1)
- plsql (2)
- nginx (4)
- apache (1)
- thrift (7)
- python (3)
- oracle (4)
- php (2)
- redis (1)
- fedora (1)
- windows7 (0)
- SVN (1)
- NFS (1)
- SAMBA (1)
- Atomikos (1)
- apache-poi (1)
- mysql (2)
- vncserver (1)
- mac (2)
- firefox (1)
- JIRA (1)
- p6spy (1)
- git (1)
- github (1)
- gitlab (1)
- gogs (1)
- Druid (1)
- MyBatis (1)
- docker (8)
- zabbix (1)
最新评论
-
lialatd:
您好,我用您的方法通过java api往jira系统中添加is ...
JIRA REST API ---- JAVA -
sprcen945:
可以了,是因为没加intercept-url 的拦截, 尼玛, ...
SpringSecurity3.X--Cas client 配置 -
sprcen945:
请问为什么我配了security.xml后切入点不起作用(之前 ...
SpringSecurity3.X--Cas client 配置 -
linxingyul:
根据楼主的代码 继承了WebMvcConfigurationS ...
SpringMVC4零配置--Web上下文配置【MvcConfig】 -
java_老头:
MvcConfig.java的FilterType.ANNOT ...
SpringMVC4零配置--Web上下文配置【MvcConfig】
一。课程:检查类
1.获得Class对象
得到Class对象
Class c = mystery.getClass();
得到超类的Class对象
TextField t = new TextField();
Class c = t.getClass();
Class s = c.getSuperclass();
通过类名获得Class对象
String strg="java.awt.Button";
Class c = Class.forName(strg);
2.获得类名
获得全路径名
Button b = new Button();
Class c = b.getClass();
String s = c.getName(); //java.awt.Button
3.发现类修饰符
定义一个类需要以下的修饰符:public,abstract,或者final。
1). 调用Class对象的getModifiers方法麳返回修饰符的集合。
2). 通过调用isPublic,isAbstract和isFinal方法麳检查修饰符。
例子:
import java.lang.reflect.*;
import java.awt.*;
class SampleModifier {
public static void main(String[] args) {
String s = new String();
printModifiers(s);
}
public static void printModifiers(Object o) {
Class c = o.getClass();
int m = c.getModifiers();//m为17,是16和1的合,public为1,final为16。
if (Modifier.isPublic(m))
System.out.println("public");
if (Modifier.isAbstract(m))
System.out.println("abstract");
if (Modifier.isFinal(m))
System.out.println("final");
}
}
示例程序的输出:
public
final
4.寻找超类
可以调用getSuperclass方法。这个方法返回超类的Class对象,或者返回null如果这个类没有超类。为了指定所有的父类,可以迭代调用getSuperclass直到返回null为止。
以下这个程序查找Button类的父类的名字。
import java.lang.reflect.*;
import java.awt.*;
class SampleSuper {
public static void main(String[] args) {
Button b = new Button();
printSuperclasses(b);
}
static void printSuperclasses(Object o) {
Class subclass = o.getClass();
Class superclass = subclass.getSuperclass();
while (superclass != null) {
String className = superclass.getName();
System.out.println(className);
subclass = superclass;
superclass = subclass.getSuperclass();
}
}
}
示例程序的输出为:
java.awt.Component
java.lang.Object
5.指定被类实现的接口
以下程序打印RandomAccessFile实现的接口。
import java.lang.reflect.*;
import java.io.*;
class SampleInterface {
public static void main(String[] args) {
try {
RandomAccessFile r = new RandomAccessFile("myfile", "r");
printInterfaceNames(r);
} catch (IOException e) {
System.out.println(e);
}
}
static void printInterfaceNames(Object o) {
Class c = o.getClass();
Class[] theInterfaces = c.getInterfaces();//得到当前类所实现的接口的类对象数组
for (int i = 0; i < theInterfaces.length; i++) {
String interfaceName = theInterfaces[i].getName();
System.out.println(interfaceName);
}
}
}
打印出以下信息:
java.io.DataOutput
java.io.DataInput
6.检查接口
如果你不确定一个Class对象到底是接口还是类,调用isInterface方法。
例子:
import java.lang.reflect.*;
import java.util.*;
class SampleCheckInterface {
public static void main(String[] args) {
Class observer = Observer.class;
Class observable = Observable.class;
verifyInterface(observer);
verifyInterface(observable);
}
static void verifyInterface(Class c) {
String name = c.getName();
if (c.isInterface()) {
System.out.println(name + " is an interface.");
} else {
System.out.println(name + " is a class.");
}
}
}
输出如下:
java.util.Observer is an interface。
Java.util.Observable is a class。
7.指定类的域
getFields方法返回一个Field对象的数组,包含每一个可访问的public域。
一个共有的域可以被任何一个成员访问:
这个类
这个类的超类
实现这个接口的类
这个类实现的接口的接口
以下的程序打印名字和类型属于GridBagConstraints类。注意这个程序首先返回Field对象,然后调用getName合getType方法。
import java.lang.reflect.*;
import java.awt.*;
class SampleField {
public static void main(String[] args) {
GridBagConstraints g = new GridBagConstraints();
printFieldNames(g);
}
static void printFieldNames(Object o) {
Class c = o.getClass();
Field[] publicFields = c.getFields(); //获得这个类所有的public的属性对象数组
for (int i = 0; i < publicFields.length; i++) {
String fieldName = publicFields[i].getName(); //属性的名字
Class typeClass = publicFields[i].getType(); //属性的类型,注意这里返回的是Class对象
String fieldType = typeClass.getName(); //属性的类型的名字
System.out.println("Name: " + fieldName +
", Type: " + fieldType);
}
}
}
输出如下:
Name: RELATIVE, Type: int
Name: REMAINDER, Type: int
Name: NONE, Type: int
Name: BOTH, Type: int
Name: HORIZONTAL, Type: int
Name: VERTICAL, Type: int
8.发现类的构造函数
为了创建一个类的实例,你调用一个特殊的方法,这个方法叫做构造函数。象方法一样,构造函数可以被重载。
你可以获得有关类的构造函数的信息,通过调用getConstructors方法,这个方法返回一个Constructor对象的数组。
你可以使用Constructor类提供的方法麳决定构造函数的名字,修饰符的结合,参数类型,和抛出异常的集合。
以下示例程序打印每一个构造函数的参数类型。程序按以下步骤执行:
1. 它返回一个Constructor对象的数组通过调用getConstructors。
2. 在Constructor数组的每一个元素,它创建一个Class对象的数组通过调用getParameterTypes。Class对象在数组中显示构造函数的参数。
3. 程序调用getName麳获得类名。
import java.lang.reflect.*;
import java.awt.*;
class SampleConstructor {
public static void main(String[] args) {
Rectangle r = new Rectangle();
showConstructors(r);
}
static void showConstructors(Object o) {
Class c = o.getClass();
Constructor[] theConstructors = c.getConstructors();
for (int i = 0; i < theConstructors.length; i++) {
System.out.print("( ");
Class[] parameterTypes =theConstructors[i].getParameterTypes();
for (int k = 0; k < parameterTypes.length; k ++) {
String parameterString = parameterTypes[k].getName();
System.out.print(parameterString + " ");
}
System.out.println(")");
}
}
}
第一行输出没有参数出现因为特定的Constructor对象显示一个没有参数的构造函数。
( )
( int int )
( int int int int )
( java.awt.Dimension )
( java.awt.Point )
( java.awt.Point java.awt.Dimension )
( java.awt.Rectangle )
9.获得方法信息
为了发现有关类的方法,你需要返回相应的Method对象。
调用getMethods方法,返回包含Method对象的数组。
你可以使用Method对象麳获得方法的名字,返回类型,参数类型,修饰符集合,抛出异常的类型。
例子描述:
1. 返回一个Method对象的数组,通过调用getMethods方法。
2. 遍历每一个元素:
a) 返回方法的名字通过调用getName方法。
b) 获得返回类型通过调用getReturnType。
c) 创建一个Class对象的数组通过调用getParameterTypes方法。
3. Class对象的数组显示方法的参数。为了返回每一个参数的类名,程序调用getName方法。
import java.lang.reflect.*;
import java.awt.*;
class SampleMethod {
public static void main(String[] args) {
Polygon p = new Polygon();
showMethods(p);
}
static void showMethods(Object o) {
Class c = o.getClass();
Method[] theMethods = c.getMethods();
for (int i = 0; i < theMethods.length; i++) {
String methodString = theMethods[i].getName();
System.out.println("Name: " + methodString);
String returnString =
theMethods[i].getReturnType().getName();
System.out.println(" Return Type: " + returnString);
Class[] parameterTypes = theMethods[i].getParameterTypes();
System.out.print(" Parameter Types:");
for (int k = 0; k < parameterTypes.length; k ++) {
String parameterString = parameterTypes[k].getName();
System.out.print(" " + parameterString);
}
System.out.println();
}
}
}
输出如下:
Name: equals
Return Type: boolean
Parameter Types: java.lang.Object
Name: getClass
Return Type: java.lang.Class
Parameter Types:
Name: hashCode
Return Type: int
Parameter Types:
Name: intersects
Return Type: boolean
Parameter Types: double double double double
Name: intersects
Return Type: boolean
Parameter Types: java.awt.geom.Rectangle2D
Name: translate
Return Type: void
Parameter Types: int int
二。课程:操纵对象
1.创建对象
1)使用没有参数的构造函数
以下的示例程序创建Rectangle类的实例,通过使用没有参数的构造方法。
import java.lang.reflect.*;
import java.awt.*;
class SampleNoArg {
public static void main(String[] args) {
Rectangle r = (Rectangle) createObject("java.awt.Rectangle");
System.out.println(r.toString());
}
static Object createObject(String className) {
Object object = null;
try {
Class classDefinition = Class.forName(className);
object = classDefinition.newInstance();
} catch (InstantiationException e) {
System.out.println(e);
} catch (IllegalAccessException e) {
System.out.println(e);
} catch (ClassNotFoundException e) {
System.out.println(e);
}
return object;
}
}
输出:
java.awt.Rectangle[x=0,y=0,width=0,height=0]
2)使用有参数的构造函数
为了使用有参数的构造函数创建对象,你可以调用Constructor对象的newInstance方法,不是Class对象。
这个技术包含以下步骤:
1. 创建一个Class对象。
2. 创建一个Constructor对象通过调用Class对象的getConstructor。getConstructor方法有一个参数:一个Class对象的数组,这些是相
发表评论
-
JIRA REST API ---- JAVA
2015-09-24 15:51 13416最近在搞自动化监控 ... -
Thrift--JSClient
2013-09-26 14:45 6014thrift提供了基于jquery--ajax的客户端调用 ... -
Thrift--Spring集成ThriftServlet
2013-09-25 11:42 11151Thrift除了可以通过TCP协议访问,还可以通过HTTP ... -
Thrift转SpringHttpInvoker
2013-09-24 13:26 1794关于在spring中集成Thrift请参看:http://h ... -
Thrift--JavaServer&PythonClient遇到的问题
2013-09-23 10:16 1469thrift在java中的应用参考:http://hanqu ... -
Spring集成Thrift--Server AND Client
2013-09-04 20:13 13787Thrift网上有N多教程, ... -
Windows Server 2008 Active Directory 安装及使用笔记
2013-03-22 18:49 26911.安装AD http://www.docin.com/ ... -
C3P0配置实战
2012-09-04 18:34 51929C3P0: 一个开源的JDBC连接池,它实现了数据源和JN ... -
使用Spring3.1 Cache注解+EHCache遇到的问题
2011-10-20 17:48 10404关于Spring3.1 Cache注解的介绍请参看http:/ ... -
JAVA压缩与解压缩--zip
2011-03-03 16:52 3433通过java打zip包或者解压 ... -
java调用Shell脚本
2009-07-10 13:13 2329原文地址:http://hi.baidu.com/qiu115 ... -
JDK5 Annotation(注释)的用法
2009-07-10 13:27 1825原文地址:http://hi.baidu.com/gaoyao ... -
JDK 1.5中的ENUM用法
2009-07-10 13:30 1338原文地址:http://www.cnblogs.com/jac ... -
jdk1.5泛型介绍
2009-07-11 09:42 1135原文地址:http://www.matrix.org.cn/r ... -
中文与acsii码相互转换方法
2009-07-13 17:59 1470在开发时,经常会用到 ... -
巧用系统属性
2009-07-15 11:22 1928我们都曾在项目中使用 ... -
String与InputStream相互转换
2009-07-20 18:48 17571.String to InputStream String ... -
java.util.Date 与java.sql.Date相互转换
2009-07-21 10:57 17331.java.util.Date to java.sql.Da ... -
Java中执行Shell(.sh)和windows批量处理(.bat)
2009-07-21 21:39 1788原文之地:http://blog.csdn.net/Nicol ... -
java验证日期格式
2009-07-24 21:02 1773public static boolean checkDate ...
相关推荐
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...
### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...
在本文中,我们将深入探讨如何使用Java反射来获取并执行某个特定的方法。 首先,我们需要了解Java反射的基本概念。`java.lang.Class`类是反射的核心,它代表了Java中的每一个类。我们可以通过以下方式获取到一个...
Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...
1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息
### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...
### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...
### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...