黑马程序员-JAVA学习之反射以及Class类的常用方法

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

Class类

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

取得某一个类的Class类实例方法一般情况下可以用以下三种方法;

class test
{
public static void main(String[] args) throws Exception{
Class a=Class.forName("MyClass");
Class b=MyClass.class;
Class c=new MyClass().getClass();
System.out.println(a==b);//输出true
System.out.println(c==b);//输出true
}
}
class MyClass{
public void print(String value){
System.out.println(value);
}
}

如上代码所示,
第一种,使用Class.forName()方法,该方法返回与带有给定字符串名的类或接口相关联的 Class 对象。
第二种,直接使用对应类的class属性,
第三种,使用某个类的实例化对象的getClass()方法,这个方法是在java.lang.Object的上帝类中定义的,功能是返回此 Object 的运行时类
这三种方法取得的Class对象是同一个引用,也就是说,这三种方法取得的Class对象都是一样的.
或许还有其他方法,不过这三个方法就够用了吧,

关于Class对象的常用方法有很多,下面对应着对Class对象的用法,一边使用一边介绍.

1.根据Class对象取得这个类的方法,包括自己定义的方法和继承过来的方法

getMethods() ,返回类型 Method[]
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

getDeclaredMethods() ,返回类型 Method[]
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

getMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。

getDeclaredMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
……
取得Method对象后,就可以使用Method的API方法了,
比如Invoke()调用方法,getName()取得这个方法的名字,getParameterTypes() 取得这个方法的签名类型,getReturnType() 取得这个方法的返回类型......

//使用方法之1
import java.lang.*;
import java.lang.reflect.*;
class FanShen//反射
{
public void print(String value){
System.out.println(value);
}
}
class Test
{
public static void main(String[] args)throws Exception{
Class c=Class.forName("FanShen");//取得类FanShen的一个类对象
Method m=c.getMethod("print",String.class);//根据方法的名字和方法签名(参数类型),取得一个方法
m.invoke(c.newInstance(),"打印情况");//调用新实例的这个方法

}
}

2.根据类对象,取得这个类的字段,并且可以更改字段的值

getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

//使用方法之二
import java.lang.*;
import java.lang.reflect.*;
class FanShen//反射
{
private int f1;//新添加的三个字段
private int f2;//新添加的三个字段
public int f3; //新添加的三个字段
public void print(String value){
System.out.println(value);
}
}
class Test
{
public static void main(String[] args)throws Exception{
Class c=Class.forName("FanShen");//取得类FanShen的一个类对象
Method m=c.getMethod("print",String.class);//根据方法的名字和方法签名(参数类型),取得一个方法
m.invoke(c.newInstance(),"打印情况");//调用新实例的这个方法
Field[] f=c.getDeclaredFields();
for(int i=0;i<f.length;i++)
{
//输出字段的类型的字段的名称
System.out.println(""+f[i].getType()+" "+f[i].getName());
}
Field f3=c.getField("f3");//取得一个f3字段的对象
FanShen fs=new FanShen();//实例化一个对象,并给字段赋值
fs.f3=8;
f3.set(fs,88888);//用这个字段,并对fs对象修改
System.out.println(fs.f3);//已经修改为88888
 }
}

3.取得方法后,可以用Method的invoke()方法来调用这个类的指定方法,Method类是在包java.lang.reflect.Method中的,在使用时要记得导入包.

这个类的方法也是有不少,常用的有getName(),
getDeclaringClass()
返回表示声明由此 Method 对象表示的方法的类或接口的 Class 对象。
getModifiers()
以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符。
getReturnType()
返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型。
getParameterTypes()
按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。
invoke(Object obj, Object... args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
......等其它方法,下面的代码示例写的是用反射的方法来调用一个类的方法,并取得返回值打印输出.

//第三
import java.lang.*;
import java.lang.reflect.*;
class FanShen//反射
{
public void print(String value)
{
System.out.println(value);
}
//新添加一个方法,连接两个字符串
public String addString(String arg1, String arg2) {
String r=arg1 + arg2;
return r;
}
}
class Test
{
public static void main(String[] args)throws Exception
{
Class c=Class.forName("FanShen");//取得类FanShen的一个类对象
Method m=c.getMethod("print",String.class);//根据方法的名字和方法签名(参数类型),取得一个方法
Class[] sign=new Class[2];//方法签名数组
sign[0]=String.class;
sign[1]=String.class;
Method addString=c.getMethod("addString",sign);
System.out.println(addString.getName());
//调用方法,并接收方法返回的值
String result=(String)addString.invoke(c.newInstance(),new Object[]{"第一个参数 ","第二个参数"});
System.out.println(result);
}
}

反射的用法当然远远不止这一些,想法有多远,就能走多远,Class类的方法还有其它好多好多,还有其它取得抛出异常的方法,取得方法修饰符的方法,等,这里就不全部写出来了
工厂方法模式里面就有用到反射来生成子类的用法,具体的在其他的学习日记里有了.这里就不重复了.

  一边写一边复习,写了大半天,不容易啊.

时间: 2024-10-11 17:13:52

黑马程序员-JAVA学习之反射以及Class类的常用方法的相关文章

黑马程序员-JAVA学习之反射getDeclaredField()方法与getField()方法的区别

--------android培训.java培训.期待与你交流!-------- 在使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊,比如:Class.getFields(), Class.getField(String), Class.getDeclaredFields(), Class.getDeclaredField(String)和Class.getMethods(), Class.getMethod(String, Class[]), Class.getDec

黑马程序员-JAVA学习日记-数组YNPB

黑马程序员学习笔记黑马程序员编程基础数组培训.培训.期待与您交流!数组:是存储同一种数据类型的的集合,也叫容器:特点:是数组中每个元素都有索引从开始:数组的定义式:数据类型数组名数据类型元素个数:数据类型数组名数据类型元素个数:如:数据类型数组名数据类型元素数据类型数组名元素如:如果元素确定就用这一种:数组中有一个属性:获取数组中的元素个数,即数组的长度:中的内存机制:栈:存储局部变量,一般定义在函数内的变量成为局部变量:特点:当内存中数据操作完成后,所占空间会自动释放栈内存堆:是通过创建的实体

黑马程序员----Java高新技术之反射学习总结

------- android培训.java培训.期待与您交流! ---------- 反射的概念. 1.Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 精妙的总结就是:反射就是将Java类中的各个成分映射成相应的Java类. 3.在Java中,描述事物的各种类同样也是一种事物,也可以用面向对象的方法来描述,即也有一个类来描述众多的J

黑马程序员-java中的反射总结

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Java 反射总结 类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM 内部表示对象的组件.在Java 中, 类装载器把一个类装入JVM 中,要经过以下步骤: 1.装载:查找和导入Class 文件: 通过一个类的全限定名来获

黑马程序员——JAVA学习笔记十四(高新技术三)

10 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代

黑马程序员——JAVA学习笔记十二(高新技术一)

 1,    静态导入: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.solaire.enhance; import static java.lang.Math.max;  //import   语句可以导入一个类或某个包中的所有类 //import static  静态导入 JDK5以后才有.语句导入一个类中的某个静态方法或所有静态方法 //无名包和有包名中的类在一起,没有package,则为无名包. //一个类

黑马程序员——JAVA学习笔记十(IO)

1,    可以从其中读入一个字节序列的对象成为输入流,可以向其中写入一个字节序列的对象就做输出流.这些字节序列的来源地可以是文件,也可以是网络连接或者内存块.抽象类InputStream和OutputStream构成了I/O层次的基础.因为字节流不便于处理以Unicode存储的信息,所以有了Writer和Reader抽象类,这些从其中继承的类都是读入和写入基于2个字节的Unicode码元,而不是单个字节.   2,    InputStream 与OutputStream: abstract

黑马程序员-Java基础之反射

反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理. 反射说白了就是可以获得一个类的所有信息,主要包括方法和属性两部分.1.获得方法包括获得方

黑马程序员——JAVA学习笔记五(异常)

1,     异常:是在运行时期发生的不正常情况. 在java中用类的形式对不正常情况进行了描述和封装对象.描述不正常的情况的类,就称为异常类. 以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问题处理代码分离,提高阅读性. 其实异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述. 不同的问题用不同的类进行具体的描述.比如角标越界.空指针异常等等. 问题很多,意味着描述的类也很多,将其共性进行向上抽取,形成了异常体系. 不正常情况分成了两大类: Throwabl