Java 反射机制浅析
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。当然反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学赋予了反射概念新的含义,但是,从现象上来说,它们确实有某些相通之处,这些有助于我们的理解。
Java反射机制主要提供下面几种用途:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的。
package com.wanggc.reflection;
import java.lang.reflect.Method;
/**
* Java 反射练习。
*
* @author Wanggc
*/
public class ForNameTest {
/**
* 入口函数。
*
* @param args
* 参数
* @throws Exception
* 错误信息
*/
public static void main(String[] args) throws Exception {
// 获得Class
Class<?> cls = Class.forName(args[0]);
// 通过Class获得所对应对象的方法
Method[] methods = cls.getMethods();
// 输出每个方法名
for (Method method : methods) {
System.out.println(method);
}
}
}

package com.wanggc.reflection; import java.lang.reflect.Method; /**
* Java 反射练习。
*
* @author Wanggc
*/
public class ForNameTest { /**
* 入口函数。
*
* @param args
* 参数
* @throws Exception
* 错误信息
*/
public static void main(String[] args) throws Exception {
// 获得Class
Class<?> cls = Class.forName(args[0]);
// 通过Class获得所对应对象的方法
Method[] methods = cls.getMethods();
// 输出每个方法名
for (Method method : methods) {
System.out.println(method);
}
}
}

当传入的参数是java.lang.String时,会输出如下结果
public boolean java.lang.String.equals(java.lang.Object)
public java.lang.String java.lang.String.toString()
public int java.lang.String.hashCode()
public int java.lang.String.compareTo(java.lang.String)
public int java.lang.String.compareTo(java.lang.Object)
public int java.lang.String.indexOf(int)
public int java.lang.String.indexOf(int,int)
public int java.lang.String.indexOf(java.lang.String)
public int java.lang.String.indexOf(java.lang.String,int)
public static java.lang.String java.lang.String.valueOf(int)
public static java.lang.String java.lang.String.valueOf(char)
public static java.lang.String java.lang.String.valueOf(boolean)
public static java.lang.String java.lang.String.valueOf(float)
public static java.lang.String java.lang.String.valueOf(char[],int,int)
public static java.lang.String java.lang.String.valueOf(double)
public static java.lang.String java.lang.String.valueOf(char[])
public static java.lang.String java.lang.String.valueOf(java.lang.Object)
public static java.lang.String java.lang.String.valueOf(long)
public char java.lang.String.charAt(int)
public int java.lang.String.codePointAt(int)
public int java.lang.String.codePointBefore(int)
public int java.lang.String.codePointCount(int,int)
public int java.lang.String.compareToIgnoreCase(java.lang.String)
public java.lang.String java.lang.String.concat(java.lang.String)
public boolean java.lang.String.contains(java.lang.CharSequence)
public boolean java.lang.String.contentEquals(java.lang.CharSequence)
public boolean java.lang.String.contentEquals(java.lang.StringBuffer)
public static java.lang.String java.lang.String.copyValueOf(char[])
public static java.lang.String java.lang.String.copyValueOf(char[],int,int)
public boolean java.lang.String.endsWith(java.lang.String)
public boolean java.lang.String.equalsIgnoreCase(java.lang.String)
public static java.lang.String java.lang.String.format(java.lang.String,java.lang.Object[])
public static java.lang.String java.lang.String.format(java.util.Locale,java.lang.String,java.lang.Object[])
public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
public void java.lang.String.getBytes(int,int,byte[],int)
public byte[] java.lang.String.getBytes()
public byte[] java.lang.String.getBytes(java.nio.charset.Charset)
public void java.lang.String.getChars(int,int,char[],int)
public native java.lang.String java.lang.String.intern()
public boolean java.lang.String.isEmpty()
public int java.lang.String.lastIndexOf(java.lang.String)
public int java.lang.String.lastIndexOf(int,int)
public int java.lang.String.lastIndexOf(int)
public int java.lang.String.lastIndexOf(java.lang.String,int)
public int java.lang.String.length()
public boolean java.lang.String.matches(java.lang.String)
public int java.lang.String.offsetByCodePoints(int,int)
public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int)
public boolean java.lang.String.regionMatches(int,java.lang.String,int,int)
public java.lang.String java.lang.String.replace(java.lang.CharSequence,java.lang.CharSequence)
public java.lang.String java.lang.String.replace(char,char)
public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)
public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String,int)
public boolean java.lang.String.startsWith(java.lang.String)
public boolean java.lang.String.startsWith(java.lang.String,int)
public java.lang.CharSequence java.lang.String.subSequence(int,int)
public java.lang.String java.lang.String.substring(int)
public java.lang.String java.lang.String.substring(int,int)
public char[] java.lang.String.toCharArray()
public java.lang.String java.lang.String.toLowerCase()
public java.lang.String java.lang.String.toLowerCase(java.util.Locale)
public java.lang.String java.lang.String.toUpperCase()
public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
public java.lang.String java.lang.String.trim()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

public boolean java.lang.String.equals(java.lang.Object)
public java.lang.String java.lang.String.toString()
public int java.lang.String.hashCode()
public int java.lang.String.compareTo(java.lang.String)
public int java.lang.String.compareTo(java.lang.Object)
public int java.lang.String.indexOf(int)
public int java.lang.String.indexOf(int,int)
public int java.lang.String.indexOf(java.lang.String)
public int java.lang.String.indexOf(java.lang.String,int)
public static java.lang.String java.lang.String.valueOf(int)
public static java.lang.String java.lang.String.valueOf(char)
public static java.lang.String java.lang.String.valueOf(boolean)
public static java.lang.String java.lang.String.valueOf(float)
public static java.lang.String java.lang.String.valueOf(char[],int,int)
public static java.lang.String java.lang.String.valueOf(double)
public static java.lang.String java.lang.String.valueOf(char[])
public static java.lang.String java.lang.String.valueOf(java.lang.Object)
public static java.lang.String java.lang.String.valueOf(long)
public char java.lang.String.charAt(int)
public int java.lang.String.codePointAt(int)
public int java.lang.String.codePointBefore(int)
public int java.lang.String.codePointCount(int,int)
public int java.lang.String.compareToIgnoreCase(java.lang.String)
public java.lang.String java.lang.String.concat(java.lang.String)
public boolean java.lang.String.contains(java.lang.CharSequence)
public boolean java.lang.String.contentEquals(java.lang.CharSequence)
public boolean java.lang.String.contentEquals(java.lang.StringBuffer)
public static java.lang.String java.lang.String.copyValueOf(char[])
public static java.lang.String java.lang.String.copyValueOf(char[],int,int)
public boolean java.lang.String.endsWith(java.lang.String)
public boolean java.lang.String.equalsIgnoreCase(java.lang.String)
public static java.lang.String java.lang.String.format(java.lang.String,java.lang.Object[])
public static java.lang.String java.lang.String.format(java.util.Locale,java.lang.String,java.lang.Object[])
public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
public void java.lang.String.getBytes(int,int,byte[],int)
public byte[] java.lang.String.getBytes()
public byte[] java.lang.String.getBytes(java.nio.charset.Charset)
public void java.lang.String.getChars(int,int,char[],int)
public native java.lang.String java.lang.String.intern()
public boolean java.lang.String.isEmpty()
public int java.lang.String.lastIndexOf(java.lang.String)
public int java.lang.String.lastIndexOf(int,int)
public int java.lang.String.lastIndexOf(int)
public int java.lang.String.lastIndexOf(java.lang.String,int)
public int java.lang.String.length()
public boolean java.lang.String.matches(java.lang.String)
public int java.lang.String.offsetByCodePoints(int,int)
public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int)
public boolean java.lang.String.regionMatches(int,java.lang.String,int,int)
public java.lang.String java.lang.String.replace(java.lang.CharSequence,java.lang.CharSequence)
public java.lang.String java.lang.String.replace(char,char)
public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)
public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String,int)
public boolean java.lang.String.startsWith(java.lang.String)
public boolean java.lang.String.startsWith(java.lang.String,int)
public java.lang.CharSequence java.lang.String.subSequence(int,int)
public java.lang.String java.lang.String.substring(int)
public java.lang.String java.lang.String.substring(int,int)
public char[] java.lang.String.toCharArray()
public java.lang.String java.lang.String.toLowerCase()
public java.lang.String java.lang.String.toLowerCase(java.util.Locale)
public java.lang.String java.lang.String.toUpperCase()
public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
public java.lang.String java.lang.String.trim()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

这样就列出了java.lang.String类的所有方法名、及其限制符、返回类型及抛出的异常。这个程序使用Class类forName方法载入指定的类,然后调用getMethods方法返回指定类的方法列表。java.lang.reflect.Method用来表述某个类中的单一方法。
使用java的反射机制,一般需要遵循三步:
- 获得你想操作类的Class对象
- 通过第一步获得的Class对象去取得操作类的方法或是属性名
- 操作第二步取得的方法或是属性
Java运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。如何取得操作类的Class对象,常用的有三种方式:
- 调用Class的静态方法forName,如上例;
- 使用类的.class语法,如:Class<?> cls = String.class;
- 调用对象的getClass方法,如:String str = "abc";Class<?> cls = str .getClass();
下面将通过实例讲述如何通过前面所诉的三步来执行某对象的某个方法:
(一)执行某对象的某个方法
package com.wanggc.reflection;
import java.lang.reflect.Method;
/**
* Java 反射练习。
*
* @author Wanggc
*/
public class ReflectionTest {
public static void main(String[] args) throws Exception {
DisPlay disPlay = new DisPlay();
// 获得Class
Class<?> cls = disPlay.getClass();
// 通过Class获得DisPlay类的show方法
Method method = cls.getMethod("show", String.class);
// 调用show方法
method.invoke(disPlay, "Wanggc");
}
}
class DisPlay {
public void show(String name) {
System.out.println("Hello :" + name);
}
}

1 package com.wanggc.reflection;
2
3 import java.lang.reflect.Method;
4
5 /**
6 * Java 反射练习。
7 *
8 * @author Wanggc
9 */
10 public class ReflectionTest {
11 public static void main(String[] args) throws Exception {
12 DisPlay disPlay = new DisPlay();
13 // 获得Class
14 Class<?> cls = disPlay.getClass();
15 // 通过Class获得DisPlay类的show方法
16 Method method = cls.getMethod("show", String.class);
17 // 调用show方法
18 method.invoke(disPlay, "Wanggc");
19 }
20 }
21
22 class DisPlay {
23 public void show(String name) {
24 System.out.println("Hello :" + name);
25 }
26 }

前面说过,Java程序的每个类都会有个Class对象与之对应。Java反射的第一步就是获得这个Class对象,如代码14行。当然,每个类的方法也必有一个Method对象与之对应。要通过反射的方式调用这个方法,就要首先获得这个方法的Method对象,如代码16行,然后用Method对象反过来调用这个方法,如代码18行。注意16行getMethod方法的第一个参数是方法名,第二个是此方法的参数类型,如果是多个参数,接着添加参数就可以了,因为getMethod是可变参数方法。执行18行代码的invoke方法,其实也就是执行show方法,注意invoke的第一个参数,是DisPlay类的一个对象,也就是调用DisPlay类哪个对象的show方法,第二个参数是给show方法传递的参数。类型和个数一定要与16行的getMethod方法一直。
上例讲述了如何通过反射调用某个类的方法,下面将再通过一个实例讲述如何通过反射给某个类的属性赋值:
(二)通过反射给某个类的属性赋值
package com.wanggc.reflection;
import java.lang.reflect.Field;
/**
* Java 反射之属性练习。
*
* @author Wanggc
*/
public class ReflectionTest {
public static void main(String[] args) throws Exception {
// 建立学生对象
Student student = new Student();
// 为学生对象赋值
student.setStuName("Wanggc");
student.setStuAge(24);
// 建立拷贝目标对象
Student destStudent = new Student();
// 拷贝学生对象
copyBean(student, destStudent);
// 输出拷贝结果
System.out.println(destStudent.getStuName() + ":"
+ destStudent.getStuAge());
}
/**
* 拷贝学生对象信息。
*
* @param from
* 拷贝源对象
* @param dest
* 拷贝目标对象
* @throws Exception
* 例外
*/
private static void copyBean(Object from, Object dest) throws Exception {
// 取得拷贝源对象的Class对象
Class<?> fromClass = from.getClass();
// 取得拷贝源对象的属性列表
Field[] fromFields = fromClass.getDeclaredFields();
// 取得拷贝目标对象的Class对象
Class<?> destClass = dest.getClass();
Field destField = null;
for (Field fromField : fromFields) {
// 取得拷贝源对象的属性名字
String name = fromField.getName();
// 取得拷贝目标对象的相同名称的属性
destField = destClass.getDeclaredField(name);
// 设置属性的可访问性
fromField.setAccessible(true);
destField.setAccessible(true);
// 将拷贝源对象的属性的值赋给拷贝目标对象相应的属性
destField.set(dest, fromField.get(from));
}
}
}
/**
* 学生类。
*/
class Student {
/** 姓名 */
private String stuName;
/** 年龄 */
private int stuAge;
/**
* 获取学生姓名。
*
* @return 学生姓名
*/
public String getStuName() {
return stuName;
}
/**
* 设置学生姓名
*
* @param stuName
* 学生姓名
*/
public void setStuName(String stuName) {
this.stuName = stuName;
}
/**
* 获取学生年龄
*
* @return 学生年龄
*/
public int getStuAge() {
return stuAge;
}
/**
* 设置学生年龄
*
* @param stuAge
* 学生年龄
*/
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
}

1 package com.wanggc.reflection;
2
3 import java.lang.reflect.Field;
4
5 /**
6 * Java 反射之属性练习。
7 *
8 * @author Wanggc
9 */
10 public class ReflectionTest {
11 public static void main(String[] args) throws Exception {
12 // 建立学生对象
13 Student student = new Student();
14 // 为学生对象赋值
15 student.setStuName("Wanggc");
16 student.setStuAge(24);
17 // 建立拷贝目标对象
18 Student destStudent = new Student();
19 // 拷贝学生对象
20 copyBean(student, destStudent);
21 // 输出拷贝结果
22 System.out.println(destStudent.getStuName() + ":"
23 + destStudent.getStuAge());
24 }
25
26 /**
27 * 拷贝学生对象信息。
28 *
29 * @param from
30 * 拷贝源对象
31 * @param dest
32 * 拷贝目标对象
33 * @throws Exception
34 * 例外
35 */
36 private static void copyBean(Object from, Object dest) throws Exception {
37 // 取得拷贝源对象的Class对象
38 Class<?> fromClass = from.getClass();
39 // 取得拷贝源对象的属性列表
40 Field[] fromFields = fromClass.getDeclaredFields();
41 // 取得拷贝目标对象的Class对象
42 Class<?> destClass = dest.getClass();
43 Field destField = null;
44 for (Field fromField : fromFields) {
45 // 取得拷贝源对象的属性名字
46 String name = fromField.getName();
47 // 取得拷贝目标对象的相同名称的属性
48 destField = destClass.getDeclaredField(name);
49 // 设置属性的可访问性
50 fromField.setAccessible(true);
51 destField.setAccessible(true);
52 // 将拷贝源对象的属性的值赋给拷贝目标对象相应的属性
53 destField.set(dest, fromField.get(from));
54 }
55 }
56 }
57
58 /**
59 * 学生类。
60 */
61 class Student {
62 /** 姓名 */
63 private String stuName;
64 /** 年龄 */
65 private int stuAge;
66
67 /**
68 * 获取学生姓名。
69 *
70 * @return 学生姓名
71 */
72 public String getStuName() {
73 return stuName;
74 }
75
76 /**
77 * 设置学生姓名
78 *
79 * @param stuName
80 * 学生姓名
81 */
82 public void setStuName(String stuName) {
83 this.stuName = stuName;
84 }
85
86 /**
87 * 获取学生年龄
88 *
89 * @return 学生年龄
90 */
91 public int getStuAge() {
92 return stuAge;
93 }
94
95 /**
96 * 设置学生年龄
97 *
98 * @param stuAge
99 * 学生年龄
100 */
101 public void setStuAge(int stuAge) {
102 this.stuAge = stuAge;
103 }
104 }

Java的发射机制中类有Class对应,类的方法有Method对应,当然属性也有Field与之对应。代码中注释已经做了详细的注释,在此不再赘述。但要注意,Field提供了get和set方法获取和设置属性的值,但是由于属性是私有类型,所以需要设置属性的可访问性为true,如代码50~51行。也可以在为整个fields设置可访问性,在40行下面使用AccessibleObject的静态方法setAccessible,如:AccessibleObject.setAccessible(fromFields, true);
前面讲述了如何用Java反射机制操作一个类的方法和属性,下面再通过一个实例讲述如何在运行时创建类的一个对象:
(三)运行时创建类的一个对象
package com.wanggc.reflection;
import java.lang.reflect.Field;
/**
* Java 反射之属性练习。
*
* @author Wanggc
*/
public class ReflectionTest {
public static void main(String[] args) throws Exception {
// 建立学生对象
Student student = new Student();
// 为学生对象赋值
student.setStuName("Wanggc");
student.setStuAge(24);
// 建立拷贝目标对象
Student destStudent = (Student) copyBean(student);
// 输出拷贝结果
System.out.println(destStudent.getStuName() + ":"
+ destStudent.getStuAge());
}
/**
* 拷贝学生对象信息。
*
* @param from
* 拷贝源对象
* @param dest
* 拷贝目标对象
* @throws Exception
* 例外
*/
private static Object copyBean(Object from) throws Exception {
// 取得拷贝源对象的Class对象
Class<?> fromClass = from.getClass();
// 取得拷贝源对象的属性列表
Field[] fromFields = fromClass.getDeclaredFields();
// 取得拷贝目标对象的Class对象
Object ints = fromClass.newInstance();
for (Field fromField : fromFields) {
// 设置属性的可访问性
fromField.setAccessible(true);
// 将拷贝源对象的属性的值赋给拷贝目标对象相应的属性
fromField.set(ints, fromField.get(from));
}
return ints;
}
}
/**
* 学生类。
*/
class Student {
/** 姓名 */
private String stuName;
/** 年龄 */
private int stuAge;
/**
* 获取学生姓名。
*
* @return 学生姓名
*/
public String getStuName() {
return stuName;
}
/**
* 设置学生姓名
*
* @param stuName
* 学生姓名
*/
public void setStuName(String stuName) {
this.stuName = stuName;
}
/**
* 获取学生年龄
*
* @return 学生年龄
*/
public int getStuAge() {
return stuAge;
}
/**
* 设置学生年龄
*
* @param stuAge
* 学生年龄
*/
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
}

1 package com.wanggc.reflection;
2
3 import java.lang.reflect.Field;
4
5 /**
6 * Java 反射之属性练习。
7 *
8 * @author Wanggc
9 */
10 public class ReflectionTest {
11 public static void main(String[] args) throws Exception {
12 // 建立学生对象
13 Student student = new Student();
14 // 为学生对象赋值
15 student.setStuName("Wanggc");
16 student.setStuAge(24);
17 // 建立拷贝目标对象
18 Student destStudent = (Student) copyBean(student);
19 // 输出拷贝结果
20 System.out.println(destStudent.getStuName() + ":"
21 + destStudent.getStuAge());
22 }
23
24 /**
25 * 拷贝学生对象信息。
26 *
27 * @param from
28 * 拷贝源对象
29 * @param dest
30 * 拷贝目标对象
31 * @throws Exception
32 * 例外
33 */
34 private static Object copyBean(Object from) throws Exception {
35 // 取得拷贝源对象的Class对象
36 Class<?> fromClass = from.getClass();
37 // 取得拷贝源对象的属性列表
38 Field[] fromFields = fromClass.getDeclaredFields();
39 // 取得拷贝目标对象的Class对象
40 Object ints = fromClass.newInstance();
41 for (Field fromField : fromFields) {
42 // 设置属性的可访问性
43 fromField.setAccessible(true);
44 // 将拷贝源对象的属性的值赋给拷贝目标对象相应的属性
45 fromField.set(ints, fromField.get(from));
46 }
47
48 return ints;
49 }
50 }
51
52 /**
53 * 学生类。
54 */
55 class Student {
56 /** 姓名 */
57 private String stuName;
58 /** 年龄 */
59 private int stuAge;
60
61 /**
62 * 获取学生姓名。
63 *
64 * @return 学生姓名
65 */
66 public String getStuName() {
67 return stuName;
68 }
69
70 /**
71 * 设置学生姓名
72 *
73 * @param stuName
74 * 学生姓名
75 */
76 public void setStuName(String stuName) {
77 this.stuName = stuName;
78 }
79
80 /**
81 * 获取学生年龄
82 *
83 * @return 学生年龄
84 */
85 public int getStuAge() {
86 return stuAge;
87 }
88
89 /**
90 * 设置学生年龄
91 *
92 * @param stuAge
93 * 学生年龄
94 */
95 public void setStuAge(int stuAge) {
96 this.stuAge = stuAge;
97 }
98 }

此例和上例运行的结果是相同的。但是copyBean方法返回的对象不再是外面传入的,而是由方法内部产生的,如第40行代码所示。注意:Class的newInstance方法,只能创建只包含无参数的构造函数的类,如果某类只有带参数的构造函数,那么就要使用另外一种方式:fromClass.getDeclaredConstructor(int.class,String.class).newInstance(24,"wanggc");
至此,Java反射机制的常用机能(运行时调用对象的方法、类属性的使用、创类类的对象)已经介绍完了。
补充:在获得类的方法、属性、构造函数时,会有getXXX和getgetDeclaredXXX两种对应的方法。之间的区别在于前者返回的是访问权限为public的方法和属性,包括父类中的;但后者返回的是所有访问权限的方法和属性,不包括父类的。
本文转载自:http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html#undefined
Java 反射机制浅析的更多相关文章
- Java反射机制浅析
概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- < 转>Java 反射机制浅析
一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领 域关于应用反射性的研究.它首先被程序 ...
- 浅析Java反射机制
目前,在项目中使用Java反射机制(除Spring框架)的地方不多,但为后续准备,简单将最近的反射体会总结如下: 1. 按光学中的反射,可以将java中的反射理解为“镜像”.有以下用途: Java反射 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- Java反射机制专题
·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
随机推荐
- QUdpSocket Class
翻译自:QT官网文档QUdpSocket类 QUdpSocket类提供一个UDP套接字. Header: #include <QUdpSocket> qmake: QT += networ ...
- 去除input在谷歌下的focus效果
input:focus{outline: -webkit-focus-ring-color auto 0;}
- Linux下 输入 env 而得到的环境变量解读
HOSTNAME=Master.Hadoop MAHOUT_HOME=/usr/hadoop/mahout-distribution-0.8 TERM=linux SHELL=/bin/bash HA ...
- 使用AsyncTask实现图片加载
如上图所示:我们看到的就是使用PrograssDialog进度条和AsyncTask异步任务实现的效果(额,不要看应用名...).下面介绍一下具体的实现流程. 一.首先使用XML布局,布局很简单直接上 ...
- 【转】SSIS 2012 – Package Configurations Menu Option Missing
原文:http://dataqueen.unlimitedviz.com/2012/01/ssis-2012-package-configurations-menu-option-missing/ I ...
- Linked List Cycle (java)
public boolean hasCycle(ListNode head) { ListNode slow=head; ListNode fast=head; if(head==null)retur ...
- 2014年1月24日 Oracle 连接查询与子查询
1.乘积连接: 源表.源数据交叉链接,结果集数量为源数据之间的乘积 2.相等链接: 通过where关联几个数据源中的某一字段进行链接 3.自链接 自己链接自己 SSF A a1, A a2 ...
- iOS 事件处理机制与图像渲染过程
Peter在开发公众号功能时触发了一个bug,导致群发错误.对此我们深表歉意,并果断开除了Peter.以下交回给正文时间: iOS 事件处理机制与图像渲染过程 iOS RunLoop都干了什么 iOS ...
- 如何查看SQLServer数据库每个表占用的空间大小?
如何查看SQLServer数据库每个表占用的空间大小? 创建存储过程: CREATE PROCEDURE [dbo].[sys_viewTableSpace]AS BEGIN SET NOCOUNT ...
- Shell学习之Shift的用法
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1 ...