Java反射3

来源:互联网 发布:西方音乐史重点知乎 编辑:程序博客网 时间:2024/05/17 09:41

1.2.5.Method类:

Method代表某个类的一个方法,提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。

方法

描述

public String getName()

返回此 Method 对象表示的方法名称

public Object invoke(Object obj,Object... args)

对象调用类的方法。如果objnull,表示调用类的静态方法。

 

简单使用Method代码

       String str="abc";

Method methodCharAt = String.class.getMethod("charAt",

int.class);

       System.out.println(methodCharAt.invoke(str1, 1));

练习:写一个程序,能够根据用户提供的类名去执行该类中的main方法

代码如下:

新建一个类TestArguments提供main方法

public class TestArguments{

    public static void main(String[] args){

       for(String arg : args){

           System.out.println(arg);

       }

    }

}

客户端测试代码:

       String startingClassName = "TestArguments";

       Method mainMethod =

Class.forName(startingClassName).getMethod("main",

String[].class);

       mainMethod.invoke(null,

(Object)new String[]{"111","222","333"});

 

1.2.6.Array类:

Array工具类用于完成对数组的发射操作。

具有相同维度和元素类型的数组属于同一个类型,即具有相同的Class实例对象

代表数组的Class实例对象的getSuperclass()方法返回的父类为Object类对应的Class

基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。

Arrays.asList()方法处理int[]String[]时的差异

例子代码:

       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()); //true

       System.out.println(a1.getClass() == a4.getClass()); //false

       System.out.println(a1.getClass() == a3.getClass()); //false

       System.out.println(a1.getClass().getName()); //[I

        //java.lang.Object

       System.out.println(a1.getClass().getSuperclass().getName());

        //java.lang.Object

       System.out.println(a4.getClass().getSuperclass().getName());

       Object aObj1 = a1;

       Object aObj2 = a4;

       //Object[] aObj3 = a1;

       Object[] aObj4 = a3;

       Object[] aObj5 = a4;

      

       System.out.println(a1);// [I@1eed786

       System.out.println(a4);// [Ljava.lang.String;@187aeca

       System.out.println(Arrays.asList(a1));// [[I@1eed786]

       System.out.println(Arrays.asList(a4)); //[a, b, c]

       int len = Array.getLength(a1);

       for(int i=0;i<len;i++){

           System.out.println(Array.get(obj, i));

       }

 

ArrayListHashSet的比较?

ArrayList是一个有序的集合,也是一个大小可变的数组。添加元素只是在相应的索引位置指向一个引用元素。因此,ArrayList可以存储相同的元素。HashSet就是采用哈希算法存储对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域,Ojbect类中定义了一个hashCode()方法来返回每个对象hashCode()方法获得该对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较,这样不用遍历集合中所有元素就可以得到结论,可见HashSet集合具有很好的对象检索性能,但是,HashSet集合存储对象的效率相对要低些,因为向HashSet集合中添加一个对象时,要先计算出对象的哈希码和根据这个哈希码确定对象在集合中的存放位置。

练习:使用配置文件加反射方式创建ArrayListHashSet的实例对象,比较观察它们的差异。

代码如下:

config.properties

className=java.util.ArrayList

 

ReflectPoint.java

public class ReflectPoint {

    private int x;

    public int y;

    public ReflectPoint(int x, int y) {

       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;

    }

}

客户端测试代码:

public class Test {

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

       InputStream ips =

ReflectTest2.class.getResourceAsStream("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(5,5);

       ReflectPoint pt3 = new ReflectPoint(3,3);

 

       collections.add(pt1);

       collections.add(pt2);

       collections.add(pt3);

       collections.add(pt1);   

       System.out.println(collections.size());

    }

}

打印结果:

如果是ArrayList打印的是4,如果是HashSet打印的是3

 

现在我们在ReflectPoint.java重写hashCodeequals方法,

ReflectPoint.java添加如写代码:

    @Override

    public int hashCode() {

       final int prime = 31;

       int result = 1;

       result = prime * result + x;

       result = prime * result + y;

       return result;

    }

    @Override

    public boolean equals(Object obj) {

       if (this == obj)

           return true;

       if (obj == null)

           return false;

       if (getClass() != obj.getClass())

           return false;

       final ReflectPoint2 other = (ReflectPoint2) obj;

       if (x != other.x)

           return false;

       if (y != other.y)

           return false;

       return true;

    }

执行上面客户端测试代码,则打印的是2

 

原创粉丝点击