(反射)Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"审",并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。
①
1.认识我吧:Class类
每当一個类被载入时,
JVM
就自动为其生成一个
Class
对象
,
通过操作
class
对象
,
我们可以得到该对象的所有成员并操作它
们
public class ClassDemo {
public static void main(String[] args) {
public class ClassDemo {
public static void main(String[] args) {
String name =
“china
";
Class stringClass = name.getClass();
System.out.println("getName: " + stringClass.getName());
System.out.println("isInterface: " + stringClass.isInterface());
System.out.println("isPrimitive: " + stringClass.isPrimitive());
System.out.println("isArray: " + stringClass.isArray());
System.out.println("SuperClass: "+ stringClass.getSuperclass().getName());
}
}
Class stringClass = name.getClass();
System.out.println("getName: " + stringClass.getName());
System.out.println("isInterface: " + stringClass.isInterface());
System.out.println("isPrimitive: " + stringClass.isPrimitive());
System.out.println("isArray: " + stringClass.isArray());
System.out.println("SuperClass: "+ stringClass.getSuperclass().getName());
}
}
2. 如何得到Class对象
它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Integer) 中预先定义好的 TYPE 字段。
•
下面就是获得一个 Class 对象的方法之一:
•
Class c = Class.forName("java.lang.String");
•
这条语句得到一个 String 类的类对象。还有另一种方法,如下面的语句:
•
Class c = int.class;
•
或者
•
Class c = Integer.TYPE;
•
3. 动态加载类,Class.forName()方法
5. 类java.lang.reflect.Field
6. 类java.lang.reflect. Modifier
7. 类java.lang.reflect. Constructor
每当一個类被载入时,JVM就自动为其生成一个Class对象
public class ClassDemo {
public static void main(String[] args) {
Class c=Class.forName( “com.cn.Test”);
public class ClassDemo {
public static void main(String[] args) {
Class c=Class.forName( “com.cn.Test”);
c.newInstance();
}
}
}
4. 类java.lang. Package
package com.bird;
import java.util.ArrayList;
import java.lang.Package;
public class Demo{
public static void main(String args[]) throws Exception{
Demo d=new Demo();
d.get("java.net.InetAddress");
}
/*
*参数为类的名字(包名.类名)
*/
public void get(String args) throws Exception{
Class c=Class.forName(args);
Package p=c.getPackage();
System.out.println(p.getName());
}
}
package com.bird;
import java.util.ArrayList;
import java.lang.Package;
public class Demo{
public static void main(String args[]) throws Exception{
Demo d=new Demo();
d.get("java.net.InetAddress");
}
public void get(String args) throws Exception{
Class c=Class.forName(args);
Field []f=c.getFields(); //得到类中所有的字段
for(Field field : f){
System.out.println(field.getName());
}
}
}
package com.bird;
import java.lang.Modifier;
public class Demo{
public static void main(String args[]) throws Exception{
Demo d=new Demo();
d.get("java.net.InetAddress");
}
public void get(String args) throws Exception{
Class c=Class.forName(args);
int m=c.getModifiers();
System.out.println(Modifier.toString(m));
}
}
7. 类java.lang.reflect. Constructor
package com.bird;
import java.lang.Modifier;
public class Demo{
public static void main(String args[]) throws Exception{
Demo d=new Demo();
d.get("java.net.InetAddress");
}
public void get(String args) throws Exception{
Class c=Class.forName(args);
Constructor[] co=c.getConstructors(); //得到构造器
for(Constructor con:co){
System.out.println(con);
}
}
}
8. 类java.lang.reflect. Method
package com.bird;
import java.lang.Modifier;
public class Demo{
public static void main(String args[]) throws Exception{
Demo d=new Demo();
d.get("java.net.InetAddress");
}
public void get(String args) throws Exception{
Class c=Class.forName(args);
Method[] co=c. getDeclaredMethods();//
得到某个类中声明的方法,不包括父类的方法
for(Method con:co){
System.out.println(con);
}
}
}
9. 动态方法调用
在程序运行过程中间,可以动态的调用某个方法, Method类的invoke方法。
method.invoke(方法所在的对象, Object[ ]); //调用方法
// Object[ ]是参数数组,如果没有参数可将数组大小为0或参数为