黑马程序员面试题Java高新技术之反射

来源:互联网 发布:mac能用的翻墙软件 编辑:程序博客网 时间:2024/05/24 05:54

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

Class   类实例代表的是内存中的字节码。


创建一个Class对象是将代表该类的字节码加载到内存中,再使 用这些字节码来创建一个一个的对象。


得到一个字节码对应的实例对象:


        A) Class class2=String.class;


        B) Class class3=Class.forName("java.lang.String");


C)Class class1=“hello!”.getClass();


 


反射:


把Java类中的各种成分映射成相应的java类


会比较占用系统内存。导致机器性能下降。


Constructor:


得到一个类中所有的构造方法:


Constructor [] constructors= Class.forName("java.lang.String").getConstructors();


得到一个类中有参的构造方法:


Constructor constructor Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);


发射法创建实例对象:


 String str (String)constructor.newInstance(new StringBuffer("abc"));


Class.newInstance()方法:


String obj (String)Class.forName("java.lang.String").newInstance();


Field:代表某个类中的一个成员变量


Method:代表某个类中的一个成员方法


例子:建立一个JavaBean类,然后进行反射。


a)建立一个JavaBean类:


public class Dot {


private int x;


private int y;


private int z;


public Dot(int x, int y,int z) {


    super();


    this.x = x;


    this.y = y;


    this.z=z;


}


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;


}


public int getZ() {


    return z;


}


public void setZ(int z) {


    this.z = z;


}


@Override


public String toString() {


    // TODO Auto-generated method stub


    return x "---" y "-----" z;


}


}


B)反射:


Constructor       con=Dot.class.getConstructor(int.class,int.class,int.class);       //得到类的构造函数


 


            Dot dot=(Dot) con.newInstance(2,3,4);/利用构造函数创建一个Dot类对象。


            Method[] method=Dot.class.getMethods();//返回公共成员方法


            for (int i = 0; i < method.length; i ) {


                System.out.println(method[i].getName());//打印出方法名。


            }


            Field fy=Dot.class.getField("z");//得到可见的属性的变量


            System.out.println(fy.getName());//以字符串形式打印该变量


fy.set(dot, 23);//设置变量在某个对象上的值


            System.out.println(fy.get(dot));//获取该变量在某个对象上的值


            Field f=Dot.class.getDeclaredField("x");//x变量在Dot类中式私有的


            f.setAccessible(true);//暴力反射    不管是什么条件都能够进行反射


            System.out.println(f.get(dot));


C)对数组的反射:


       


        Object[] ob=new Object[]{"abc",123,'a'};


        System.out.println(ob.getClass().isArray());//判定此 Class 对象是否表示一个数组类。


        int length=Array.getLength(ob);//返回数组ob的长度


        for (int i = 0; i <length ; i ) {


            System.out.println(Array.get(ob, i).getClass());


            //得到数组中每个对象的字节码。


        }