您的位置:首页 > 职场人生

黑马程序员——【Java反射学习】方法的反射/成员变量的反射/构造函数的反射

2015-05-24 16:44 633 查看
------Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

Class类的使用
方法的反射
成员变量的反射
构造函数的反射
反射的应用:测试泛型的本质

1.Class类
①在面向对象的世界里,万事万物皆对象。
java语言中,静态的成员、普通的数据类型、类是不是对象呢?类是(哪个类的对象呢?)谁的对象呢?
类是对象,类是java.lang.Class类的实例对象。
②这个对象到底如何表示
③Class.forName("类的全称")
不仅表示了,类的类类型,还代表了动态加载类
请大家区分编译、运行
编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
④基本数据类型
void关键字 都存在类类型
⑤Class类的基本API操作。

现在,我们通过一个小程序来了解一下基本数据类型对应的类类型

class ClassDemo

{
public static void main(String[] args)
{
Class c1=int.class;//int的类类型
Class c2=String.class;//String类的类类型 String类字节码
Class c3=double.class;
Class c4=Double.class;
Class c5=void.class;

System.out.println(c1.getName());//打印int
System.out.println(c2.getName());//打印java.lang.String
System.out.println(c2.getSimpleName())//打印String(不包含包名的类的名称)
System.out.println(c3.getName());//打印double
System.out.println(c4.getName());//打印java.long.Double
System.out.println(c5.getName());//打印void
}

}

//打印结果自行验证

--------------------------------------分割线要长--------------------------------------

import java.lang.reflect.Field;

import java.lang.reflect.Method;
class ClassDemo1
{
public static void main(String[] args)
{

String s="hello";

ClassUtil.printClassMessage(s);//获取方法的信息。

ClassUtil.printFieldMessage("hello");//获取成员变量的信息。

ClassUtil.ConMessage("hello");//获取构造函数信息

}

}

class ClassUtil

{

/**

*打印类的信息,包括类的成员函数、成员变量、构造函数

*/

public static void printClassMessage(Object obj)
{
//要获取类的信息,首先要获取类的类类型
Class c=obj.getClass();//传递的是哪个子类的对象,c就是该子类的类类型
//获取类的名称
System.out.println("类的名称是:"+c.getName());
/*
*Method类,方法对象
*一个成员方法就是一个Method对象
*getMethods()方法获取的是所有的public的函数,包括父类继承而来的
*getDeclaredMethods()获取的就是所有该类自己声明的方法,不问访问权限。
*/
Method[]ms=C.getMethods();//
for(int i=0;i<ms.length;i++)
{
//得到方法的返回值类型
Class returnType=ms[i].getReturnType();
System.out.print(returnType.getName()+"");
//得到方法的名称
System.ouy.print(ms[i].getName()+"(");
//获取参数类型---->得到的是参数列表的类型的类类型
Class[]parmTypes=ms[i].getParameterTypes();
for(Class c:parmTypes)
SYstem.out.print(c.getName()+",");
}
System.out.println(")")
}

}

public class ClassDmeo

{
public static void main(String[]args)
{
String s="hello";
ClassUtil.printClassMessage(s);

Integer n1=1;
ClassUtil.printClassMessage(n1);
}

public static void printFieldMessage(Object obj)

{

Class c=obj.getClass();

/*

*成员变量也是对象

*java.lang.reflect.Field

*Field类封装了关于成员变量的操作

*getFields()方法获取的是所有public的成员变量的信息

*getDeclaredFields获取的是该类自己声明的成员变量的信息

*/
Field[]fs=c.getFields();
for(Filed field:fs)
{
//得到成员变量的类型的类类型
Class fieldType=field.getType();
String typeName=fieldType.getName();
//得到成员变量的名称
String fieldName=field.getName();
System.out.println(typeName+""+fieldName);
}

}

public satic void ConMessage(Objeci obj)

{

/*

*构造函数也是对象

*java.lang.Constructor中封装了构造函数的信息

*getConstructors获取所有的public的构造函数

*getDeclaredConsturctors得到所有的构造函数

*/

Class c=obj.getClass();

//Constructor[]cs=c.getConstructors();

Constructor[]cs=c.getDeclaredConsturctors

for(Consturctor c:cs)

{

System.out.println(c.getName()+"(");

//获取构造函数的参数列表---->得到的是参数裂变的类类型

Class[]paramTypes=constructor.getParameterTypes();

for(Class class1:paramTypes)

{

System.out.println(class1.get.Name()+",");

}

System.out.println(")");

}

}

}

//打印结果请自行验证

_________________________________
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐