黑马程序员_Java类型信息与反射

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

一、类类型信息

运行时类型信息使得你可以在程序运行时发现和使用类型信息。

二、Class对象

它包含了与类有关的信息。事实上,Class对像就是用来创建类的所有的“常规”对象的。

类是程序的一部分,每个类都有一个class对象。换言之,每当编写并且编译了一个新类,就会产生一个class对象,它是被保存在一个同名的.class文件中。此类由Java虚拟机使用类加载器创建。 所有的类都是在对其第一次使用时,动态加载到JVM中的,就是说需要那个类时才加载。一旦某个类的class对象被载入内存,它就被用来创建这个类的所有对象。

为了使用类而做的准备工作实际包含三个步骤:

1. 加载,这是由类加载器执行的。该步骤将查找字节码(通常在classpath所指定的路径中查找),并从这些字节码中创建一个class对象。

2. 链接,在链接阶段将验证类中的字节码,为静态域分配内存空间,并且如果必须的话,将解析这个类创建的对其他类的所有引用。

3. 初始化,如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。

三、反射:运行时的类信息

可以简单的理解为已知类名,来调用类成员或是对象成员的过程称为反射。他的设计思想是把类中的成员看作一个Java类,比如说成员方法类(Method)、成员变量类(Field)、构造方法类(Contructor)、字节码文件类(Class)

反射类库包:java.lang.reflect

重要的工具类及其常用方法:

Class<T>,描述类相关信息。

        getFields(),获取类中所有的成员变量。

        getMethods(),获取类中所有的成员方法。

        getConstructors(),获取类中所有的构造器方法。

Field,描述类中对象的成员变量的类。

       get(),获取类中某一成员变量的值。

       set(),设置类中某一成员变量的值。

Method,描述类中对象的成员方法的类。

       invoke(),调用类中的方法。

Constructor,描述构造器的类。

       newInstance(),创建一个对象。

代码样例:

Base类

package demo.test.reflect;

public class Base {
	
	public Integer id=0;
	
	public String  name="base";
	
	public boolean isEmpty=true;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public boolean isEmpty() {
		return isEmpty;
	}
	public void setEmpty(boolean isEmpty) {
		this.isEmpty = isEmpty;
	}
	
	public Base(String s){
		System.out.println(s);
	}
	public Base(int x,int y){
		System.out.println("两个数的结果为:"+(x+y));
	}
	public Base(){
		System.out.println("我是Base类,无参构造器");
	}
	
	public void testA(){
		System.out.println("我是testA()方法");
	}

	public void testB(String s){
		System.out.println("我是testB()方法");
		System.out.println("输入的值为:"+s);
	}

}


使用反射技术操作Base类

package demo.test.reflect;

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

public class DemoMain {
	
	public static void main(String[] args) {
		
		Class clazz=null;
		Base base=null;
		try {
			clazz=Class.forName("demo.test.reflect.Base");//在classpath下获取类信息
			base=(Base)clazz.newInstance();//初始化类对象
		} catch (ClassNotFoundException 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();
		}
		//显示类的所有成员变量,成员变量必须是public,否则成员变量获取不到。
		System.out.println("Base类的成员变量:");
		Field[] fields=clazz.getFields();
		for(Field f:fields){
			System.out.println(f.getName());
		}
		
		System.out.println("设置与获取成员变量的值:");
		try {
			Field field=clazz.getField("id");
			field.set(base, 5);
			System.out.println(field.get(base));
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("--------------------");
		
		System.out.println("Base类的构造方法:");
		Constructor[] constructors=clazz.getConstructors();
		for(Constructor c:constructors){
			System.out.println(c.getName());
		}
		System.out.println("--------------------");
		
		System.out.println("Base类的成员方法:");
		Method[] methods=clazz.getMethods();
		for(Method m:methods){
			System.out.println(m.getName());
		}
		System.out.println("--------------------");
		
		System.out.println("Base类调用成员方法:");
		try {
			Method method=clazz.getMethod("testB",String.class);
			method.invoke(base, "a");
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("--------------------");
		
	}

}


 ---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值