反射

------- android培训java培训、期待与您交流! ----------

                        

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.4JDK1.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(nullnew 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 //Int1维数组

[Ljava.lang.Object;@4f1d0d  //Object类型的1维数组

           

    //直接输出,通过结果即可判断 B S I J F D C Z

              基本数组数组会被认为是Object

              引用类型数组会被认为是Object[]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值