Class类介绍

       Class类是一个保存运行时信息的类,它包含了与类有关的信息。事实上,Class对象就是用来创建类的所有的“常规”对象的。Java使用Class对象来执行其RTTI(Run-Time Type Information,运行时类型信息)。

   类是程序的一部分,每个类都有一个Class对象。换句话说,每当编写并且编译了一个新类,就会产生一个Class对象。无论何时,只要你想在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用。Class.forName()就是实现此功能的途径,因为你不需要为了获得Class引用而持有该类型的对象。但如果你已经拥有了一个类型的对象,那就可以通过调用getClass()方法来获取Class引用,这个方法是属于Object类的一部分,他将返回表示该对象的实际类型的Class引用。关于Class.forName()和getClass()用法的具体区别以及理解如下:

package com.zys.test;

public class Test {
	public static void main(String[] args) {
		try {
			Class c=Class.forName("com.zys.test.Person");
			System.out.println("c ="+c);
			Person person=new Person();
			Class c1=person.getClass();
			System.out.println("c1="+c1);
			if(c==c1){
				System.out.println("c =c1");
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}
测试结果如下:

   从上面的结果可以看到,这两种方法都是用来获得一个Class对象的,Class.forName()不需要获得一个Person对象,只要知道它的全限定名(包含包名)即可获得Class对象,而getClass()方法需要通过一个已知的对象来调用从而获得该对象的Class对象。


   Class就可以提供我们很多信息,比如属性/方法/修饰符/构造器/类名等等。然后我们就可以进一步进行反射。不过,现在将具体介绍Class对象的重要的方法的含义及其用法:

1.getName():获得包名和类名

public class Test {
	public static void main(String[] args) {
		Person person1=new Person("张三",12);
		Class c=person1.getClass();
		System.out.println(c.getName());
		//输出com.zys.test.Person
	}
}

2. getSimpleName():获得类名

public class Test {
	public static void main(String[] args) {
		Person person1=new Person("张三",12);
		Class c=person1.getClass();
		System.out.println(c.getSimpleName());
		//输出Person
	}
}

3.getSuperclass():获得父类的包名和类名

public class Test {
	public static void main(String[] args) {
		Student student=new Student();
		Class c=student.getClass();
		System.out.println(c.getSuperclass());
		//输出class com.zys.test.Person
	}
}

4.getDeclaredFields(String fieldname):返回值为Field对象,返回某个属性的修饰符,类型,包名类名和属性名

public class Test {
	public static void main(String[] args) {
		Person person1=new Person("张三",12);
		Class c=person1.getClass();
		try {
			System.out.println(c.getDeclaredField("name"));
			//输出:private java.lang.String com.zys.test.Person.name
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
	}
}

5.getType():通过Field对象调用该方法,可以返回某个字段(属性)的类型

public class Test {
	public static void main(String[] args) {
		Person person1=new Person("张三",12);
		Class c=person1.getClass();
		try {
			Field field=c.getDeclaredField("age");
			System.out.println(field.getType());
			//输出:int
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
	}
}

6.getModifiers():通过返回int型整数值来表示该字段的修饰符


public class Test {
	public static void main(String[] args) {
		Person person1=new Person("张三",12);
		Class c=person1.getClass();
		System.out.println(c.getModifiers());
		//输出:1
	}
}

7.Field的setAccessible(boolean falg):当某个类的成员变量为private时,需要执行setAccessible(true)才可通过field.get(obj)来获得当前值。

public class Test {
	public static void main(String[] args) {
		Person person1=new Person("张三",12);
		Class c=person1.getClass();
		try {
			Field field=c.getDeclaredField("age");
			field.setAccessible(true);
			System.out.println(field.get(person1));
			//输出:12
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
如果没有field.setAccessible(true)这一句,将会出现以下异常:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖墩有点瘦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值