黑马程序员--反射

本文深入探讨Java反射机制,包括Class类的使用、获取类的完整结构、调用类中方法及属性、操作数组与模拟框架等核心内容。通过实例解析,展现反射在Java开发中的强大功能。

---------------------- JavaEE+Android开发JavaEE+Android培训、期待与您交流! ----------------------

Java的反射机制

反射(反射就是把java类中的各种成分映射成相应的java类)

1,  Class类(反射的基石)

所有类的对象实际上都是Class类的实例。

 Class类常用的方法:

  Publicstatic Class<?> forName(String className ) 传入完整的“包.类”名称实例化Clas对象

Public Constructor[] getConstructors()   得到一个类中的全部构造方法

实例化Class的方式

类.class

对象.getClass

Class.forName(“包.类”);

注:三种实例化Class对象的方式是一样的,但对前两种来说都需要导入一个明确的类,如果一个类操作不明确,可以使用forName,有很强的灵活性。

2,  Class类的使用

2.1无参构造实例化对象

Class  c  = Class.forName(“包.类”);

Per  =  c.newinstance();

注:被实例化对象的类中必须存在无参的构造方法。如果不存在,则不可以被实例化。

2.2有参构造实例化对象

步骤:

通过Class类中getConstructorson()取得本类中的全部构造方法。

将取得的构造方法存入一个构造方法类型的对象数组中

使用Constructor实例化对象

Constructor类方法:

 Public T newInstance(Object…obj)

 向构造方法中传递参数,实例化对象。

3,  通过反射获取一个类的完整结构

Constructor:表示类中的构造方法

构造方法的修饰符,名称,参数类型,信息,实例化对象

Field:表示类中的属性

Methods:表示类中的方法

3.1取得所实现的全部接口

  PublicClass[] getInterfaces();   

3.2取得父类

 PublicClass<?super T> getSuperClass()

3.3取得全部方法

Class类中有Public Method[]getMethods() (得到一个类中的全部方法)这个方法。

返回的是Method类的对象数组,

Method类中的方法:

  方法的访问修饰符,名称,全部参数类型,返回值类型,全部抛出的异常

注:IDE中的类方法提示功能就是利用此种方式完成的。

3.4取得类中全部的属性

得到实现的接口或父类中的公共属性:

Public Field[] getFields()

得到本类中的全部属性:

Public Field[] getDeclaredFields()

返回的是Field类的数组

Field类中具有设置和获取属性的方法

 

4,  反射除了可以取得一个类中的完整结构外,还可以调用类中的指定方法或指定属性,并可以通过反射完成对数组的操作。

4.1通过反射调用类中方法

步骤:

 通过Class类中getMethod(Stringname,Class…parameterTypes)方法取得一个Method的对象,并设置此方法操作时所需要的参数类型

使用invoke()进行调用,并向方法中传递要设置的参数

Class  c  = Class.forName(“包.类”);

Method met = c.getMethod(name,type)

met.invoke(c.newinstance(),type)

若为静态方法则:

        Met,invoke(null,type)

访问main方法

 

     StringstartingClassName = args[0];
      Method mainMethod =Class.forName(startingClassName).getMethod(“main”,String[].class);
           mainMethod.invoke(null,new Bbject[]{newString[]{“111”,”222”,”333”}});
     或    mainMethod.invoke(null,(Object)newString[]{“111”,”222”,”333”});
 

4.2调用setter和getter方法

 即Introductor内省中javabean是一种特殊的java类

Class Person
{
Private int x;
Public int getAge(){
Return x;
}
Public void setAge(itn  age){
This.x = age;
}
}


Ageà如果第二个字母是小写,则把第一个字母变成小写

gettime--time

setTime--time

getCPU--CPU

4.3通过反射操作属性

 第一种:可以通过使用Method调用类中的Setter和getter方法设置和取得属性,

第二种:通过使用Field类提供的set()和get()方法就可以完成设置和取得属性内容的操作。

4.4通过反射操作数组(基本类型不是Object)

    1,维数相同,类型相同的数组得到的Class相同

       维数不同,类型相同的数组得到的Class不同

       维数相同,类型不同的数组得到的Class不同

    2,代表数组的Class实例对象的getSuperClass()方法返回的是父类的Object类对应的Class。

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

    4,Array.asLIst()方法处理int[]和String[]时的差异。

    5,Array工具类

4.5通过反射来模拟框架

InputStream ips = ReflectTest2.class.getResourceAsStream("/cn/itcast/day1/resources/config.properties");
Properties props = new Properties();
props.load(ips);
ips.close();
String className =props.getProperty("className");
Collection collections = (Collection)Class.forName(className).newInstance();

---------------------- JavaEE+Android开发JavaEE+Android培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值