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

关于java反射的总结

2015-05-22 09:42 211 查看
 

1、反射的概念

a) 定义:反射就是把java类中的各个成分映射成相应的java类

b) 举例说明:

例如,一个java类用一个Class类的对象来表示,一个类中的组成部分:成员变量、方法、构造方法、包等信息,也用一个个的java类来表示,就像汽车是一个类,汽车中的发动机变速箱等等也是一个个的类,表示java类的Class类显然要提供一些列的方法来获得其中的变量、方法、构造方法、修饰符、包等信息,这些恶信息就是用相应累的实例对象来表示,它们是Field、Method、Constructor、Package。

2、Class类

反射类的基石---Class类

Java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class。

对比提问:众多的人用一个什么类表示?人。

众多的java类用一个什么类表示?Class。

对比提问:Person类代表人,它的实例对象就是张三、李四这样一个个人。

     Class类代表java类、它的各个实例对象又分别代表什么?

对应各个类在内存中的字节码。

                例如:Person类的字节码,ArrayList类的字节码,一个类被类加载器加 载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码, 不同类的字节码是不同的,所以他们在内存中的内容是不同的,这一个个
的空间可分别用一个个对象来表示。

如何得到各个字节码对应的实例对象(Class类型)?

(1)类名.class 例:System.class

(2)对象.getClass() 例:new Data().getClass();

(3)Class.forName(“类名”) 例:Class.forName(“java.util.Date”);

 代码示例:

 

package reflect;

public class ReflectTest {

/**
* @param args
*/
public static void main(String[] args)throws Exception
{
//定义一个字符串
String str1="abc";
//通过三种方式获取各个字节码对应的实例对象
Class cls1=str1.getClass();
Class cls2=String.class;
Class cls3=Class.forName("java.lang.String");
//判断各个字节码受否相同
sop(cls1==cls2);//true
sop(cls1==cls3);//true
//判断是否是基本类型
sop(cls1.isPrimitive());//false
sop(int.class.isPrimitive());//true
sop(int.class==Integer.class);//false
sop(int.class==Integer.TYPE);//true
}

private static void sop(Object obj) {
System.out.println(obj);
}
}


3、Constructor类

a) Constructor类代表某个类中的一个构造方法

b) 代码示例:

 

package reflect;

import java.lang.reflect.Constructor;

public class ConstructorDemo {

/**
* @param args
*/
public static void main(String[] args) throws Exception
{
//new String(new StringBuffer("abc"));
Constructor con1=String.class.getConstructor(StringBuffer.class);
String str2=(String)con1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
//得到某个类所有的构造方法
Constructor[] constructors=Class.forName("java.lang.String").getConstructors();
//创造某一个构造方法
Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);
//获取方式时用到类型
//创建实例对象
//通常方式:String str=new String(new StringBuffer("abc"))
//反射方式:
String str=(String)constructor.newInstance(new StringBuffer("abc"));
//调用获得的方法时要用到上面相同类型的实例对象Class.newInstatce()方法
System.out.println(str.charAt(1));

}

}


4、Field类

a) Fiedl类代表某个类中的一个成员变量

b) 代码示例

package reflect;

import java.lang.reflect.Field;

public class FiledDemo {

/**
* @param args
*/

public static void main(String[] args) throws Exception
{

ReflectPoint pt1=new ReflectPoint(3,5);
Field fieldY=pt1.getClass().getField("y");
sop(fieldY.get(pt1));
Field fieldX=pt1.getClass().getDeclaredField("x");
fieldX.setAccessible(true);
sop(fieldX.get(pt1));

}

private static void sop(Object object) {
System.out.println(object);

}

}


5、Method类

a) Method类代表某个类中的一个成员方法得到类中的某一个方法

b) 代码示例

 

package reflect;

import java.lang.reflect.Method;

public class MethodDemo {

/**
* @param args
* @throws ClassNotFoundException
* @throws NoSuchMethodException
* @throws SecurityException
*/
public static void main(String[] args) throws Exception
{
/*调用方法:
通常方法:sop(Str.charAt(1));
反射方法:sop(charAt.invoke(str,1));*/
String str="osnfosfns";
Method methodCharAt=Class.forName("java.lang.String").getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str,1));
System.out.println(methodCharAt.invoke(str, new Object[]{0}));
}

}


6、数组的反射

代码示例

package reflect;

import java.lang.reflect.Array;
import java.util.Arrays;

public class ArrayDemo {

/**
* @param args
*/
public static void main(String[] args) {
int [] a1=new int[3];
int [] a2=new int[4];
int [][] a3=new int[2][3];
String[] a4=new String[]{"3","nsfosn","nfos"};
//sop(a1.getClass()==a2.getClass());
//sop(a1.getClass()==a3.getClass());
Object obj1=a1;
Object obj2=a2;
Object obj3=a3;
Object obj4=a4;
//		sop(obj1);
//		sop(obj2);
//		sop(obj3);
//		sop(obj4);
//		sop(Arrays.asList(a1));
//		sop(Arrays.asList(a4));
printObject(a1);
printObject(a4);

}
private static void printObject(Object obj)
{
Class clazz=obj.getClass();
if(clazz.isArray())
{
int len=Array.getLength(obj);
for(int i=0;i<len;i++)
{
sop(Array.get(obj, i));
}
}
else
{
sop(obj);
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}

}


7、实现将字符串中的a换成b

代码实现:

package reflect;

import java.lang.reflect.Field;

public class ChangeBToAByField {

/**
* @param args
*/
public static void main(String[] args) throws Exception
{
//定义一个实例对象
ReflectPoint pt1=new ReflectPoint(3,5);
System.out.println(pt1);
//改变字符串中的值,b-->a
changeStringValue(pt1);
System.out.println(pt1);
}
public static void changeStringValue(Object obj)throws Exception
{
//获取对象中所有变量
Field[] fields =obj.getClass().getFields();
//判断Field中的成员是否是字符串,如果是就将b替换成a
for(Field field:fields)
{
if(field.getType()==String.class)
{
String oldValue=(String)field.get(obj);
String newValue=oldValue.replace('b', 'a');
field.set(obj, newValue);

}

}
}

}


8、实例:用反射实现简单的框架

代码实现:

package reflect;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;

public class ReflectProperties {

/**
* @param args
*/
public static void main(String[] args) throws Exception
{
InputStream ips=new FileInputStream("file\\config.properties");
Properties props=new Properties();
props.load(ips);
ips.close();
String ClassName=props.getProperty("className");
Collection collections=(Collection)Class.forName(ClassName).newInstance();
ReflectPoint pt1=new ReflectPoint(3,3);
ReflectPoint pt2=new ReflectPoint(3,3);
ReflectPoint pt3=new ReflectPoint(3,44);
ReflectPoint pt4=new ReflectPoint(3,55);
collections.add(pt1);
collections.add(pt1);
collections.add(pt3);
collections.add(pt4);
System.out.println(collections.size());

}

}


-

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息