1、Class是一个类
2、对象照镜子后可以得到的信息,某个类的数据成员名,方法和构造函器、某个类到底实现了哪个接口。
3、对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含了特定某个类的有关信息。
4、Class对象只能由系统建立对象。
5、一个类在LVM中只会有一个Class实例
反射案例(修改指定对象内的值)
2、对象照镜子后可以得到的信息,某个类的数据成员名,方法和构造函器、某个类到底实现了哪个接口。
3、对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含了特定某个类的有关信息。
4、Class对象只能由系统建立对象。
5、一个类在LVM中只会有一个Class实例
获取Class对象的三种方式
package ReflexPakage;
public class ReflexTest2 {
public static void main(String[] args) throws Exception
{
//得到Class对象
Class clazz = null;
//1、直接通过类名.class的方式得到(但是必须要确定是某个类名才可以使用)
clazz = Person.class;
//2、通过对象调用getClass()方法来获取
Object obj = new Person();
clazz = obj.getClass();
//3、通过全类名的方式获取(比较常用的方式)
String className = "ReflexPakage.Person";
clazz = Class.forName(className);
System.out.print(clazz);
}
}
反射案例(修改指定对象内的值)
import java.lang.reflect.Field;
public class ReflexTest1 {
public static void main(String[] args) throws Exception
{
ReflexPoint pt1 = new ReflexPoint("bet","base");
changeStrValue(pt1);
// pt1.setAccessible(true);
System.out.print(pt1.toString());
}
private static void changeStrValue(Object obj) throws Exception
{
Field[] field = obj.getClass().getFields();
for(Field f : field)
{
if(f.getType() == String.class)
{
String oldValue = (String) f.get(obj);
String newValue = oldValue.replace("b","a");
f.set(obj, newValue);
}
}
}
}
class ReflexPoint
{
private int x;
public int y;
public String str1;
public String str2;
ReflexPoint(int x, int y)
{
this.x = x;
this.y = y;
}
ReflexPoint(String str1, String str2)
{
this.str1 = str1;
this.str2 = str2;
}
public String toString()
{
return str1+" "+str2;
}
}
反射案例(输出对象指定类的值)
package MethodPackage;
import java.lang.reflect.Array;
import java.util.Arrays;
public class ReflexTest4 {
public static void main(String[] args)
{
int[] a1 = new int[]{1,23,4,4};
int[] a2 = new int[4];
int[][] a3 = new int[2][3];
String[] a4 = new String[]{"李鸿章","袁世凯","张作霖"};
//输出a1是什么类型的数组
System.out.println(a1.getClass().getName());
//输出a1是什么类型的对象
System.out.println(a1.getClass().getSuperclass().getName());
//输出a4是什么类型的对象
System.out.println(a4.getClass().getSuperclass().getName());
printObject(a4);
System.out.println();
System.out.println(Arrays.asList(a4));
}
public static void printObject(Object obj)
{
Class clazz = obj.getClass();
if(clazz.isArray())
{
int len = Array.getLength(obj);
for(int i =0;i<len; i++)
{
System.out.print(Array.get(obj, i)+" ");
}
}
}
}