反射机制学习日记(2)
今天是之前学完的第二课:
Class类中的方法的使用(含代码和注释):
getName()获得全限定名称(含包名)
getSimpleName()获得类名(不含包名)
isPrimitive()判断某个类是不是基本数据类型
isInterface()判断Class实例是不是一个接口
isAnnotation()判断Class实例是不是一个注解
isArray()判断Class实例是不是一个数组
isEnum()判断当前调用的Class实例是不是一个枚举
getSuperclass()获取当前实例对象的父类
getInterfaces()获得调用此方法的Class实例对象的所有接口
getModifier()获取访问权限修饰符,通常配合Modifer.toString来用
package LessonForReflection02;
import java.io.Serializable;
import java.lang.reflect.Modifier;
class person
{
}
abstract class Student extends person implements Serializable,Testable01,Testable02
{
}
public class GetClass
{
public static void main(String[] args)
{
System.out.println("==============================");
//以下是对本类做查询
System.out.println("以下是对本类做查询");
Class<Student> c1 = Student.class;//获取一个.class方法获得Student类的class实例
//获得全限定名称
System.out.println(c1.getName());
//获得类名没有包名
System.out.println(c1.getSimpleName());
//得到一个类的package实例,获取当前的包名
System.out.println(c1.getPackage().getName());
//判断某一个class是不是代表一个基本数据类型
System.out.println(c1.isPrimitive());
//判断它是不是一个接口
System.out.println(c1.isInterface());
//判断它是不是一个注解
System.out.println(c1.isAnnotation());
//判断它是不是一个数组
System.out.println(c1.isArray());
//判断它是不是一个枚举
System.out.println(c1.isEnum());
System.out.println("==============================");
//以下是获取父类信息
//获取本类的父类,当前Student的父类是Person
System.out.println("获取本类的父类,当前Student的父类是Person");
Class<?> c2 = c1.getSuperclass();
System.out.println(c2.getName());
System.out.println("==============================");
//以下是获取接口类型
//接口是返回一个class三数组,因为可以接多个接口
System.out.println("接口是返回一个class三数组,因为可以接多个接口");
Class<?>[] c3 = c1.getInterfaces();
for (Class<?> c:c3)
{
System.out.println(c.getName());//Student类实现了3个接口
}
System.out.println("==============================");
//获取访问权限修饰符
System.out.println("获取访问权限修饰符");
int mod1 = c1.getModifiers();//getModifiers()方法获取到的权限修饰符为整形
String modifier = Modifier.toString(mod1);//Modifier类中的toString()方法可以把传入的权限修饰符整形形式装换成字符串形式
System.out.println(modifier);//由于此时Student类前没有任何修饰符所以此时输出为空,我给他改成了abstract
Class<GetClass> c4 = GetClass.class;
int mod2 = c4.getModifiers();
String modifierForGetClass = Modifier.toString(mod2);
System.out.println(modifierForGetClass);
System.out.println("==============================");
//获取JDK里自涵的类的访问权限修饰符
System.out.println("获取JDK里自涵的类的访问权限修饰符");
int mod3 = Integer.class.getModifiers();
String mod3f = Modifier.toString(mod3);
System.out.println(mod3f);
System.out.println("==============================");
//获取接口信息修饰符信息
System.out.println("获取接口信息修饰符信息");
int mod4 = Serializable.class.getModifiers();
String mod4f = Modifier.toString(mod4);
System.out.println(mod4f);
System.out.println("==============================");
//JDK8.0之后提供的新方法.toGenertoGenericString()方法效果如下
System.out.println("获取接口信息修饰符信息");
System.out.print(c1.toGenericString());
}
}
Package类中常用的方法(含代码和注释):
java.lang.Package:
String getName()得到包名
static Package getPackage(String name)得到指定的包
static Package[] getPackage()得到当前开发环境下的所有包
package LessonForReflection02;
public class GetPackage
{
public static void main(String[] args)
{
//1.
// String getName();//得到包名
// static Package getPackage(String name);//得到 指定包
Package p1 = Package.getPackage("java.lang");//获得到字符串所对应的包的名字,封装到P怕这个对象中去
System.out.println(p1.getName());//得到包的名字
//2.
// static Package[] getPackage;//得到当前开发环境下的所有包
Package[] p2 = Package.getPackages();
for (Package p:p2)
{
System.out.println(p.getName());
}
}
}
Field类中的常用方法(含代码和注释):
getFields()仅能获取到本类及父类接口中的public属性,没有申明权限修饰符的属性也是得不到的
getDeclaredFields()得到调用该方法对象的类中声明过的属性
package LessonForReflection02;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
interface Jumpable
{
public static final int JUMPABLE_HIGH = 200;//常量
}
class Person01
{
int person_age;
public String person_name;
}
class Student01 extends Person01 implements Jumpable
{
int student_score;
public int student_age;
private int speed;
}
public class FiledInfGeter
{
public static void main(String[] args)
{
Class<Student01> c1 = Student01.class;
//获得Student类中可以用的public属性
//field用来封装类里面的域的
Field[] stu_field1 = c1.getFields();//仅能获取到本类及父类和接口中的public属性
for (Field f1:stu_field1)
{
System.out.println(f1);
}
System.out.println("-----------------");
Field[] stu_field2 = c1.getDeclaredFields();//得到调用该方法对象的类的声明过的属性!
for (Field f2:stu_field2)
{
System.out.println(f2);
}
System.out.println("-----------------");
try
{
// Field f1 = c1.getField("speed");//私有的是得不到的
// Field f2 = c1.getField("student_score");//没有申明权限修饰符的也没有是得不到的
//
// int mod1 = f1.getModifiers();
// System.out.println(Modifier.toString(mod1));
//
// int mod2 = f2.getModifiers();
// System.out.println(Modifier.toString(mod2));
Field f3 = c1.getField("student_age");//能够获得public属性的修饰符
int mod3 = f3.getModifiers();
System.out.println(Modifier.toString(mod3));
} catch (NoSuchFieldException | SecurityException e)//可以把平行的异常类型用|隔开写在一起
{
e.printStackTrace();
}
System.out.println("-----------------");
//获取person_name这个属性的类型
try
{
// Field f5 = c1.getField("person_age");f5创建不了,person_age不是public类型
Field f4 = c1.getField("person_name");//只能获得到public类型的
Class<?> type = f4.getType();
System.out.println(type);
} catch (NoSuchFieldException | SecurityException e)
{
e.printStackTrace();
}
}
}
部分文字来源于:
咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》
轻量化研习Java相关技术倡导者
“爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富。