1.Class类
a) JAVA程序中的各个JAVA类属于同一个事物,描述这类事物的JAVA类名就是Class.
b) Class 类名 包名 成员变量 方法 父类
c) 代表内存中的一份字节码
d) 类名.class 实例.getClass() Class.forName(“java.lang.String”);
2.九个预定义Class实例对象
a) Int.class=Integer.TYPE (8个基本类型)+ void.class
b)
public static void Test() throws ClassNotFoundException
{
String s1="abc";
Class cls1=s1.getClass();
Class cls2=String.class;
Class cls3=Class.forName("java.lang.String");
System.out.println(cls1==cls2); //T
System.out.println(cls2==cls3); //T
System.out.println(cls1==cls3); //T
//是否是原始类型
System.out.println(cls1.isPrimitive()); //F
System.out.println(int.class.isPrimitive()); //T
System.out.println(int.class==Integer.class); //F
System.out.println(int.class==Integer.TYPE); //T
System.out.println(int[].class.isPrimitive()); //F
System.out.println(int[].class.isArray()); //T
}
3.总之是在源程序中出现的内容,都有其对应的Class实例对象
4.什么是反射
a) 把JAVA类中的各种成分映射成相应的JAVA类。
b) 相应的类包括:Field Method Constructor Package ...
5.构造方法
a) Constructor<String> java.lang.Class.getConstructor(Class<?>... parameterTypes) //1.5+可变参数
b) Constructor[] cons=String.class.getConstructors(); //所有
c) String.class.getConstructor(StringBuffer.class); //指定
d) 例子:
e) String s1=(String)
String.class.getConstructor(StringBuffer.class).
newInstance(new StringBuffer("abc"));
f) 编绎时会进行类型检查,区别于运行时
g) newInstance() //快速通过无参构造方法获得对象
6.成员变量Field
a)
定义一个用来测试的类
class ReflectPoint
{
private int x;
public int y;
public String s1;
private String s2;
public ReflectPoint(int x, int y) {
this.s1="abc";
this.s2="def";
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public String toString() {
return (s1+" "+s2);
}
}
b) 得到对象上X,Y的值
ReflectPoint rp1=new ReflectPoint(3,5);
Class c=rp1.getClass();
Field f1=rp1.getClass().getField("y");
System.out.println(f1.getInt(rp1)); //0
Field f2=rp1.getClass().getDeclaredField("x");
f2.setAccessible(true); //暴力反射
System.out.println(f2.get(rp1));
c) 设置所有的String字段为”aaa”
public static void FieldTest() throws Exception
{
ReflectPoint rp1=new ReflectPoint(3,5);
Class c=rp1.getClass();
Field[] fs1=c.getFields();
for(Field f:fs1)
{
if(f.getType()==String.class)
{
f.setAccessible(true);
System.out.println("AAAAAAAAAAAA"+(String)f.get(rp1));
f.set(rp1, "aaa");
}
}
Field[] fs2=c.getDeclaredFields();
for(Field f:fs2)
{
if(f.getType()==String.class)
{
f.setAccessible(true);
System.out.println("BBBBBBBBBBBB"+(String)f.get(rp1));
f.set(rp1, "aaa");
}
}
System.out.println(rp1);
}
结果:
AAAAAAAAAAAAabc
BBBBBBBBBBBBaaa
BBBBBBBBBBBBdef
aaa aaa
7.Method
a)
public static void MethodTest() throws Exception
{
String s="abc";
Method m1=s.getClass().getMethod("charAt", int.class);
System.out.println(m1.invoke(s,1));
}
b)JDK1.4和JDK1.5的区别
1.4: Publci Object invoke(Object obj,Object[] Args)
1.5: Publci Object invoke(Object obj,Object ... Args)
c)
public static void ArgsTest() throws Exception
{
//ArgsTest.main(new String[]{"111","222"});
Method m=ArgsTest.class.getMethod("main",String[].class);
m.invoke(null, new String[]{"111","222"} );
//1.4会将其当作2个参数对待
//m.invoke(null,new Object[]{ new String[]{"111","222"}} );
//m.invoke(null,(Object)new String[]{"111","222"} );
}
8.数组的反射 Array
a) 相同的类型AND维度
b) 示例:
public static void ArrTest() throws Exception
{
int[] a1=new int[]{1,2,3};
int[] a2=new int[4];
int[][] a3=new int[2][3];
String[] a4=new String[]{"a","b","c"};
System.out.println(a1.getClass()==a2.getClass());
System.out.println(a1.getClass().getName());
System.out.println(a2.getClass().getName());
System.out.println(a3.getClass().getName());
System.out.println(a4.getClass().getName());
System.out.println(a1.getClass().getSuperclass());
System.out.println(a2.getClass().getSuperclass());
System.out.println(a3.getClass().getSuperclass());
System.out.println(a4.getClass().getSuperclass());
Object o1=a1;
//Object[] o2=a1; //基本类型的数组会被认为是Object
Object[] o3=a3;
Object[] o4=a4;
System.out.println(Arrays.asList(o1));
System.out.println(Arrays.asList(o4));
printObj(o1);
printObj(new Object());
}
private static void printObj(Object obj) {
Class clazz=obj.getClass();
if(clazz.isArray())
{
int len=Array.getLength(obj);
for(int i=0;i<len;i++)
{
System.out.println(Array.get(obj,i));
}
}
else
{
System.out.println(obj);
}
}
结果:
true
[I
[I
[[I
[Ljava.lang.String;
class java.lang.Object
class java.lang.Object
class java.lang.Object
class java.lang.Object
[[I@dc8569]
[a, b, c]
1
2
3
java.lang.Object@1bab50a
c)得到数组的类型
1.
Object[] obj=new Object[]{1,"abc"};
System.out.println(obj);
System.out.println(obj[0].getClass().getName());
System.out.println(obj[1].getClass().getName());
结果:
[Ljava.lang.Object;@150bd4d //Object的一维数组
java.lang.Integer
java.lang.String
2.模块化后的方法
public static void Arr1Test() throws Exception
{
int[] a=new int[3];
Object[] b=new Object[3];
getType(a);
getType(b);
}
private static void getType(Object[] o) //接收引用类型数组
{
System.out.println(o);
}
private static void getType(Object o) //接收基本类型数组
{
System.out.println(o);
}
结果:
[I@18a992f //Int型1维数组
[Ljava.lang.Object;@4f1d0d //Object类型的1维数组
//直接输出,通过结果即可判断 B S I J F D C Z
基本数组数组会被认为是Object
引用类型数组会被认为是Object[]