JAVA Class 类探究


Java 中所有的对象都是primitive 类型或者 reference类型。所有的reference类型都继承自Object类。对于任何继承自Object类的对象,jvm提供了一个Class类的实例,使得可以对运行时对象获取其类型信息。如下图所示:


本文以一个继承自Fruit的Apple为例进行介绍,所有的示例部分都在最后的代码中。

 

Class 类 ,java.lang.Class

 

一 获取Class对象

声明一个Class 对象,和普通类声明对象时一样,类名 + 对象名,即Class classObj = null

获取Class 对象有三种方法,请注意它们的区别

Object.getClass()

.class

Class.forName(StringclassName)

 

二 获取Class的成员

Class中的成员包括三类:fileds,methods,constructors

对Class的这三种成员访问有两种方式:一种是获取所有的成员;一种是按需获取,如获取名字叫做getName的方法。

 

不同的方法对Class成员的访问权限也不尽相同,详细的Class成员访问机制如图所示:

 

fields

getDeclaredMethods()就可以获取所有类本身的方法,不能获取继承而来的field,可以获取private field。

getMethods()可以获取本身的方法和从父类继承来的方法,不能获取private field。

getDeclaredField(Stringname),可以通过field的名字获取对应的field,如果没有该域,则抛出异常。

 

Construtor

Class对象Class.getConstructor(Class[]parameterTypes)可以按照期望的Construtor参数列表,获取类的Construtor,这里以获取Apple类的Apple(String address)这个Construtor为例介绍。

 

三 利用Class创建实例,

有两种方法利用反射进行创造实例

<1>Class.newInstance()

<2>Constructor.newInstance() (推荐)

区别:

方法<1>只能调用无参Constructor,

方法<1>可能抛出任何异常,方法<2>利用InvocationTargetException进行封装

方法<1>需要Constructor是visible,方法<2> Constructor可以是private,方法<2>中按照前面获取的Construtor,并且指定需要的参数。


 代码如下:

Fruit类

public class Fruit{
	public String name;
	private int sweet; //甜度
	private int sour;  //酸度
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSweet() {
		return sweet;
	}
	public void setSweet(int sweet) {
		this.sweet = sweet;
	}
	public int getSour() {
		return sour;
	}
	public void setSour(int sour) {
		this.sour = sour;
	}
	
}

Apple类

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

public class Apple extends Fruit {
	public String address;
	private int days;
	
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public int getDays() {
		return days;
	}
	public void setDays(int days) {
		this.days = days;
	}
	public Apple(){
		
	}
	public Apple(String address){
		this.address = address;
	}
	public static void main(String []args){
		Class classObj = null;
		Apple apple = new Apple();
		try {
			//--------------   获取Class对象    -------------------
			// Class.forName 
			classObj = Class.forName("java.lang.Integer");
			System.out.println("Class.forName is "+classObj);
			
			// Object.getClass()
			classObj = apple.getClass();
			System.out.println(".getClass is "+classObj);
			
			// .class
			classObj = Apple.class;
			System.out.println(".class is "+classObj);
			
			// ----------------  获取Class的field  ----------------
			// 获取该Class的所有declared fileds
			Field [] declaredFields = classObj.getDeclaredFields();
			System.out.println("The Declared fields of Apple is :");
			for (Field field : declaredFields){
				System.out.print(field.getName() +" ");
			}
			System.out.println();
			// 获取该Class的所有fields,包括继承得来的field
			Field [] fields = classObj.getFields();
			System.out.println("All fields of Apple is :");
			for (Field field : fields){
				System.out.print(field.getName() +" ");
			}
			// 按照field的名字获取field
			Field singleField = classObj.getDeclaredField("days");
			System.out.println("field with name days is : "+ singleField.getName());
			
			// ----------------  两种实例化方法 -------------------
			// 利用Class.newIntance()
			Object appleObj = classObj.newInstance();
			System.out.println(appleObj instanceof Apple);
			// 利用Construtor.newInstance()
			
			Class []parameterTypes = {Class.forName("java.lang.String")};
			Constructor constructor = classObj.getConstructor(parameterTypes);
		    appleObj = constructor.newInstance("beijing");
			if(appleObj instanceof Apple){
				apple = (Apple) appleObj;
				System.out.println("Apple address is " +apple.getAddress());
			}
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

运行结果:

Class.forName is class java.lang.Integer
.getClass is class Apple
.class is class Apple
The Declared fields of Apple is :
address days 
All fields of Apple is :
address name field with name days is : days
true
Apple address is beijing

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值