JAVA获取Class对象及其Class类中的常用方法

反射:

反射是我们 经常用到的一个知识点,那什么是反射呢?

反射就是在程序运行过程中分析类的一种能力

在这里我们想一下我们在编写java的时候,先写java源文件——>字节码文件(class文件)——>然后就可以通过 对象.方法调用具体的方法,反射就是吧这个动作的反过来就可以理解为反射。
对象.方法——>字节码文件——>访问里边的其它方法和属性。
那反射能做什么事情呢?

  1. 分析类(通过类加载器实现的)
    加载并初始化一个类
    查看类的所有属性和方法

  2. 查看并使用对象
    查看一个对象的所有属性和方法
    使用对象的任意属性和方法
    下面我们先说第一个重要的知识点
    类加载器(classloader)
    负责将类的字节码文件(.class文件)加载 到内存中,并生成对应的Class对象(每个类只有一个class对象)。

下面我们通过代码演示什么时候加载类的class对象:

//创建类的实例
	Student stu = new Student();
//访问类的静态成员
	People.sleep();//静态方法
	//调用人的静态方法或成员变量时就会创建 对应的class对象
	//初始化类的子类
	class User extends Person{}
	//这里就会先加载父类的claas对象再加载子类的class对象
	//反射方式创建类的class对象
	Class class = Class.forName("类的正名");
	//正名:包名+类名 

通俗点来说就是当你使用一个类的一个成员时类的加载器就会吧对应的class对象加载到内存中。

获取Class对象的三种方式

  1. Object 类的getClass()方法。
  Class class = 对象名.getClass();
  1. 类的静态属性
Class class = 类名.class
  1. Classl类的静态方法
Class class = Class.forName("类的正名");

Class类常用方法

Class类提供了很多方法让我们使用,看一下我们常用的方法有哪些;

public static void reflexMethod3() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		//获取Class对象
		Class itemcls =  Class.forName("cn.yunhe.beans.Item");
		//获取所有公共的构造器
		//Constructor[] cons = itemcls.getConstructors();
		//获取所有的构造器包括私有的
		Constructor[] cons = itemcls.getDeclaredConstructors();
		for (int i = 0; i < cons.length; i++) {
			//cons[i].getParameterCount()获取构造器中形参的个数
			//			System.out.println(cons[i] + " " + cons[i].getParameterCount());
			if (cons[i].getParameterCount() == 2) {
				//要创建带有具体参数的对象
				Item item = (Item) cons[i].newInstance("phone",4999);
				System.out.println(item);
			}
		}

	}
	/**
	 * 获取方法
	 * @throws ClassNotFoundException 
	 * @throws SecurityException 
	 * @throws NoSuchMethodException 
	 */
	public static void method() throws ClassNotFoundException, NoSuchMethodException, SecurityException {
		Class itemCls = Class.forName("cn.yunhe.beans.Item");
		//获取方法		getDeclaredMethods();只获取当前对象的方法
		Method[] methods= itemCls.getDeclaredMethods();
		//获取方法 		getMethods();获取当前对象的全部方法(包括父类中继承的方法)
		// Method[] methods= itemCls.getMethods();
		for (int i = 0; i < methods.length; i++) {
			System.out.println(methods[i]);
			//参数一:方法名   参数二: 参数类型
			Method method = itemCls.getMethod("setItemNameString", String.class);
			System.out.println(method);
		}
	}
/**
	 * 获取属性
	 * @throws ClassNotFoundException 
	 */
	public static void property() throws ClassNotFoundException {
		Class itemCls = Class.forName("cn.yunhe.beans.Item");
		//		获取属性 getFields() 只能获取当前的对象的属性
		//		Field[] fils = itemCls.getFields();
		//		获取属性 getDeclaredFields() 获取当前对象的全部属性,包括私有的、公共的、默认的、受保护的
		Field[] field =itemCls.getDeclaredFields();
		for (int i = 0; i < field.length; i++) {
			System.out.println(field[i]);
		}
		
	}
}

注意点:
1、我们在使用第三方的Jar包的时候,他里面没有Java文件,只有Class文件,我们怎么才能知道class文件里的到底有什么呢,可以用反射机制进行反射,找到里面的方法及属性,怎么让程序才知道我要去反射哪一个Class文件呢,给到一个包名加类名=路径名,那就可以找到这个路径了,就能找到Class文件了,对这个CLass类里面人家提供了有方法,用来获取各种各样类里面的东西,我们首要前提找构造器,因为我们要创建对象

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java ,`Class` 是用于表示一个或接口的元数据信息。`Class` 提供了一些常用方法获取的信息以及进行反射操作。下面是一些常用的 `Class` 方法及其作用: 1. `getName()`:获取的全限定名(包括包名)。 2. `getSimpleName()`:获取的简单名称(不包括包名)。 3. `getPackage()`:获取所在的包。 4. `getSuperclass()`:获取的父。 5. `getInterfaces()`:获取实现的接口列表。 6. `isInterface()`:判断当前是否是接口。 7. `isEnum()`:判断当前是否是枚举型。 8. `isAnnotation()`:判断当前是否是注解型。 9. `isArray()`:判断当前是否是数组型。 10. `isPrimitive()`:判断当前是否是基本数据型。 11. `getDeclaredFields()`:获取的所有字段(包括私有字段)。 12. `getDeclaredMethods()`:获取的所有方法(包括私有方法)。 13. `getDeclaredConstructors()`:获取的所有构造方法(包括私有构造方法)。 14. `newInstance()`:创建的实例对象(需要无参构造方法)。 15. `getDeclaredField(String name)`:获取指定名称的字段。 16. `getDeclaredMethod(String name, Class<?>... parameterTypes)`:获取指定名称和参数型的方法。 这只是一小部分 `Class` 方法,还有其他一些方法可以用于获取的注解、泛型信息等。通过 `Class` ,我们可以在运行时获取和操作的信息,实现动态性和灵活性。 需要注意的是,`Class` 方法Java 9 进行了一些调整和新增,具体使用时请查阅相关文档以及适用你使用的 Java 版本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值