标签:
1、背景
1)Reflection也就是反射 是Java被视为动态(或准动态)语言的一个关键性质
2)反射机制指的是程序在运行时能够获取任何类的内部所有信息
2、实现功能概述
1)只要给定类的全名,即可通过反射获取类的所有信息。
2)反射可以在程序运行时获取任意一个对象所属的类对象。
3)在运行时可以获取到类中所有属性对象,并对其操作(包括私有属性)。
4)在运行时可以获取到类中,父类中所有方法,并调用。
5)目前主流的应用框架如Struts2,Hibernate,Spring,SpringMVC等框架的核心全部是利用Java的反射机制来实现的。
Class对象的机制与实现
1、Class对象概述
1)Class其实就是类的类型
2)字符串类型就是String,整形类型就是Integer,String和Integer类型就是Class
2、Class对象的常用方法介绍

newInstance() 实例化对象
3、实例化对象的三种方式
JavaBean
public class Book {
private int id;
private String name;
public String type;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the type
*/
public String getType() {
return type;
}
/**
* @param type the type to set
*/
public void setType(String type) {
this.type = type;
}
}
package main;
import bean.Book;
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Class demo1=null;
Class demo2=null;
Class demo3=null;
//实例化对象的第一种方式
try{
demo1=Class.forName("bean.Book");
}catch(Exception e){
e.printStackTrace();
}
System.out.println(demo1);
//实例化对象的第二种方式
Book bo=new Book();
Object ob=bo;
System.out.println("第二种"+ob.getClass());
//实例化对象的第三种方式
demo3=Book.class;
System.out.println("第三种"+demo3);
//
try {
Book bo1=(Book)demo3.newInstance();
System.out.println("实例化后的类对象:"+bo1);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


package main;
import java.lang.reflect.Field;
import bean.Book;
public class FieldTest {
//该方法用于使用传递过来的Class对象获取类中的属性
public void show(Class c1){
Field[] fi=c1.getDeclaredFields(); //{可以将私有属性获取到} getDeclaredFields()获取类中的所有属性
for(Field ff:fi){
System.out.println(ff.getName());
System.out.println(ff.getType());
}
System.out.println("~~~~~~~~~~~~~~~~~");
Field[] fi1=c1.getFields(); //只可以获取到公有属性
for(Field ff1:fi1){
System.out.println(ff1.getName());
System.out.println(ff1.getType());
}
System.out.println("~~~~~~~~~~~~~~~~~");
}
//该方法用于使用传递过来的实体类对象 获取属性以及属性的值
public void show(Object ob){
Class c1=ob.getClass();
Field[] fi=c1.getDeclaredFields();
for(Field ff:fi){
try {
ff.setAccessible(true);
System.out.println(ff.getName()+":"+ff.get(ob));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Book bo=new Book();
bo.setId(1);
bo.setName("倾城之恋");
bo.setType("文学");
FieldTest ft=new FieldTest();
ft.show(Book.class);
Book oob=new Book();
oob.setId(2);
oob.setName("那年夏天");
oob.setType("文学");
FieldTest ft1=new FieldTest();
ft1.show(oob);
}
}


getDeclaredAnnotations() 获取方法的全部注解
package main;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import bean.Book;
public class MethodTest {
//该方法用于获取对象的所有方法名称、返回值类型、以及参数信息
public void show(Object ob){
Class c2=ob.getClass();
Method[] mt=c2.getDeclaredMethods();
for(Method mm:mt){
System.out.println("方法名称:"+mm.getName());
System.out.println("方法修饰符"+Modifier.toString(mm.getModifiers()));
System.out.println("方法返回值类型"+mm.getReturnType());
System.out.println("方法参数列表");
Class[] preType=mm.getParameterTypes();
for(Class c21:preType){
System.out.println(c21.getName());
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Book bk=new Book();
bk.setId(3);
bk.setName("我和凤姐居住的日子");
bk.setType("惊悚");
MethodTest mt=new MethodTest();
mt.show(bk);
}
}

package main;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import bean.Book;
public class MethodTest {
//该方法用于获取对象的所有方法名称、返回值类型、以及参数信息
public void show(Object ob){
Class c2=ob.getClass();
Method[] mt=c2.getDeclaredMethods();
for(Method mm:mt){
System.out.println("方法名称:"+mm.getName());
System.out.println("方法修饰符"+Modifier.toString(mm.getModifiers()));
System.out.println("方法返回值类型"+mm.getReturnType());
System.out.println("方法参数列表");
Class[] preType=mm.getParameterTypes();
for(Class c21:preType){
System.out.println(c21.getName());
}
}
}
//该方法用于使用传递过来的实体对象 获取其中的方法 并调用
public void showUse(Object ob){
Class c1=ob.getClass();
try {
Method me=c1.getMethod("getName", null);
try {
me.invoke(ob, new Object[0]);
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Method me1=c1.getMethod("setName", String.class);
try {
me1.invoke(ob, "嘻游记");
Class[] c4={String.class,int.class};
Method me2=c1.getMethod("test", c4);
Object[] obb={"哈哈",12};
me2.invoke(ob, obb);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Book bk=new Book();
bk.setId(3);
bk.setName("我和凤姐居住的日子");
bk.setType("惊悚");
//MethodTest mt=new MethodTest();
//mt.show(bk);
MethodTest mte=new MethodTest();
mte.showUse(bk);
System.out.println(bk.getName());
}
}

标签:
原文地址:http://my.oschina.net/u/2356966/blog/409174