黑马程序员---JAVA反射机制 二

本文探讨了Java培训中的关键技术:数组的反射。详细解释了数组类型、基本与非基本类型数组的使用方式,以及如何通过反射操作数组。通过案例展示了如何利用反射实现框架功能,包括对int[]和String[]的处理差异,以及如何通过配置文件和反射创建集合实例。此外,文章还介绍了如何使用反射创建小框架,并比较了不同集合类在实现相同功能时的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

数组的反射
具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象
代表数组的Class实例对象的getSuperClass方法返回的父类为Object类对应的Class
基本类型的一维数组可以被当做Object类型使用不能当做Object[]类型使用
非基本类型的一维数组既可以当做Object类型使用也可以当做Object[]类型使用
Arrays.asList()方法处理int[]和String[]时的差异
Array工具类用于完成对数组的反射操作

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().getName());//[I
System.out.println(a1.getClass().getSuperclass().getName());//java.lang.Object          System.out.println(a3.getClass().getName());//[[I           System.out.println(a3.getClass().getSuperclass().getName());//java.lang.Object
Object obj1=a1;
Object obj2=a4;
//Object[] obj3=a1;//错
Object[] obj4=a3;
Object[] obj5=a4;       System.out.println(a1);//[I@139a55
System.out.println(a4);//[Ljava.lang.String;@1db9742            System.out.println(Arrays.asList(a1));//[[I@139a55]         System.out.println(Arrays.asList(a4));//[a, b, c]

传过来一个Object类型的数据,把它打印出来
首先要判断这个Object是不是数组,然后分别打印
如果是数组就拆包,如果不是就直接打印

class TestArgument{
    public static void main(String[] args) {
        String []a1=new String[]{"a","b","c"};
        printObject(a1);
        printObject("xyz");
    }
    private 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.println(Array.get(obj, i));
            }
        }else{
            System.out.println(obj);
        }
    }
}

反射的作用—实现框架功能
框架与框架要解决的核心问题
我盖房子给用户住,有用户自己负责安装门窗、空调、家具等,我做的房子就是框架,用户需要用我的框架,然后把门窗等放进框架中,框架与工具类的区别是工具类被用户类调用,而框架则是调用用户提供的类
框架要解决的核心问题
我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序,我写的框架程序怎样调用到你以后写的类(门窗)呢?
因为写框架时不知道要被调用的类名,所以在程序中无法直接new某个类的实例对象,而要用反射来做
综合案例
先直接用new语句创建ArrayList和HashSet的实例对象,比较两个集合的运行结果差异
然后改为采用配置文件加反射的方式创建ArrayList和HashSet的实例对象
ArrayList是按顺序放对象的引用
HashSet是放对象是要比较对象的hash值

package reflect;

public class ReflectPoint {
    private int x;
    public int y;
    public String str1="ball";
    public String str2="basketball";
    public String str3="itcast";
    public ReflectPoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @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;
        ReflectPoint other = (ReflectPoint) obj;
        if (x != other.x)
            return false;
        if (y != other.y)
            return false;
        return true;
    }

    @Override
    public String toString(){
        return str1+":"+str2+":"+str3;
    }
}

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;

public class ReflectTest3 {
    public static void main(String[] args) throws InterruptedException {
//      Collection collections=new ArrayList();
        Collection collections=new HashSet();
        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());
    }
}

下面写一个小框架
首先定义一个配置文件config.properties
className=java.util.ArrayList
然后

package reflect;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;

public class ReflectTest2 {
    public static void main(String[] args) throws Exception {
        InputStream ips=new FileInputStream("config.properties");
        Properties prop=new Properties();
        prop.load(ips);
        ips.close();
        String className=prop.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());
    }
}

运行这个程序,只要把你写的类名写的配置文件里就好了,当
className=java.util.HashSet,结果为2,
当className=java.util.ArrayList,结果为4

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值