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

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

你可能感兴趣的:(JAVA学习,java,反射)