您的位置:首页 > 编程语言 > Java开发

java学习之反射机制

2010-04-21 00:53 483 查看
什么是反射

java程序可以在运行期间动态的加载、解析和使用一些在编译阶段并不确定的类型,这一机制被称为“反射(reflection)”或者“内省(introspection)”.

反射机制提供的功能

1,加载运行时才能确定的类型

2,解析类的结构、获取其内部信息

3,操作该类型或其实例

1》访问属性

2》调用方法

3》创建新对象

java.lang.class 类

class类的实例用于表示运行时的JAVA数据类型,包括类、接口、数组、枚举、注解和基本数据类型

在类加载时, Java虚拟机会自动创建相应的class对象

java.lang.reflect包

1,java.lang.reflect.fleld

2,java.lang.reflect.Method

3,java.lang.reflect.Costructor

4,java.lang.reflect.Modifer

5,java.lang.reflect.Array

使用反机制的基本步骤

获取目标类型相应的class对象

调用Class对象内省方法获取目标类成员信息

访问目标类方法信息/操作目标类成

例一

package com.manager;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;

public class TestReflection01 {

public static void main(String[] args) {
System.out.println("input the type of the class");
Scanner scan = new Scanner(System.in);
String className= scan.next();
System.out.println("current class name : " + className);
try {
//获取CLASS对象
Class c = Class.forName(className);

//解析属性信息
Field[] fs = c.getFields();
for(Field f : fs){
System.out.println("-------------------------------");
System.out.println("属性:" + f.toString());
System.out.println("数据类型:" + f.getType());
System.out.println("属性名:" + f.getName());
int mod = f.getModifiers();
System.out.println("属性修饰符:" + Modifier.toString(mod));
System.out.println("-------------------------------");
}

//解析方法信息t
Method[] ms = c.getDeclaredMethods();
for(Method m : ms){
System.out.println("--------------------------------");
System.out.println("方法:" + m.toString());
System.out.println("方法名:" + m.getName());
int mod = m.getModifiers();
System.out.println("方法修饰符:" + Modifier.toString(mod));
System.out.println("方法参数列表");
Class pts[] = m.getParameterTypes();
for(int i = 0; i < pts.length; i++){
Class clazz = pts[i];
if(i != 0){
System.out.println(clazz);
}
}
System.out.println();
System.out.println("返回值类型:" + m.getReturnType());
}

//解析构造方法信息
Constructor[] cs = c.getConstructors();
for(Constructor con : cs){
System.out.println("----------------------------------");
System.out.println("构造方法:" + con.toString());
System.out.println("方法名:" + con.getName());
int mod = con.getModifiers();
System.out.println("方法修饰符:" + Modifier.toString(mod));
System.out.println("方法参数列表");
Class pts[] = con.getParameterTypes();
for(int i = 0; i < pts.length; i++){
Class clazz = pts[i];
if(i != 0){
System.out.println(clazz);
}
}
System.out.println();
System.out.println("-----------------------------------");
}

//解析当前类类型的父类

Class superClass = c.getSuperclass();
System.out.println("当前类的父类:" + superClass.toString());
System.out.println("-------------------");
//解析当前类实现的接口
Class[] interfaces = c.getInterfaces();
System.out.println("当前类所实现的接口");
for(Class class1 : interfaces){
System.out.println(class1.toString());
}
//解析当前是类型所在包信息
Package p = c.getPackage();
System.out.println("当前类所在包:" + p.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//解析方法信息

}

}


例二

package com.manager;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

class User{
public String name;
public int age;
public static int total = 100;
User(){
super();
}
User(String name, int age){
super();
this.name = name;
this.age = age;
}
public void SetAll(String name, int age){
this.name = name;
this.age = age;
}
public static void showAll(){
System.out.println("int static method showTotal , total = " + total);
}
public String toString(){
return "userName = " + name + "/t age = " + age;
}

}
public class TestReflection02 {

public static void main(String[] argss) {
try{
User p1 = new User("张三", 18);
TestReflection02 t = new TestReflection02();
System.out.println("------------------------------------------");
t.mf1(p1, "name" ,"李四");
t.mf1(p1, "age", 30);
System.out.println(p1);
System.out.println("------------------------------------------");
t.mf2("com.manager.User", "total", 88);
System.out.println("------------------------------------------");
Class[]argTypes = new Class[]{String.class, int.class};
Object[] args = new Object[]{"王五", 99};
t.mf3(p1, "SetAll", argTypes, args);
System.out.println(p1);
System.out.println("------------------------------------------");
t.mf4("com.manager.User", "showAll", new Class[0], new Object[0]);
}catch(Exception ex){
ex.printStackTrace();
}
}

public void mf1(Object  o, String fieldName, Object newValue)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Class c = o.getClass();
Field f = c.getField(fieldName);
Object fv = f.get(o);
System.out.println("修改前:" + fieldName + "=" + fv);
f.set(o, newValue);
System.out.println("修改前:" + fieldName + "=" + f.get(o));
}

public void mf2(String className, String fieldName, Object newValue)
throws ClassNotFoundException, SecurityException,
NoSuchFieldException,
IllegalArgumentException,IllegalAccessException {
Class c = Class.forName(className);
Field f = c.getField(fieldName);
Object fv = f.get(c);
System.out.println("修改前:" + fieldName + "=" + fv);
f.set(c, newValue);
System.out.println("修改前:" + fieldName + "=" + f.get(c));
}

public void mf3(Object o, String MethodName, Class[] argsType, Object[] args)
throws ClassNotFoundException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
Class c = o.getClass();
Method m = c.getMethod(MethodName, argsType);
Object result = m.invoke(o, args);
System.out.println("result : " + result);
}

public void mf4(String className, String MethodName, Class[] argsType, Object[] args)
throws ClassNotFoundException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
Class c = Class.forName(className);
Method m = c.getMethod(MethodName, argsType);
Object result = m.invoke(c, args);
System.out.println("result : " + result);
}

}


获取CLASS对象

针对引用数据类型

调用静态方法Class.ForName(String (class 全称包括包名))

调用Object类中定义的getClass()方法

使用.class 表达式
例:class c1 = String.class;
class c2 = Person.class;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: