JAVA学习日记:反射机制(2)

    科技2022-07-10  118

    反射机制学习日记(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余年高校项目实践毕设指导经验;企业软培经验丰富。

    可以转载我的学习日记但请注明出处,谢谢。

    Processed: 0.020, SQL: 8