黑马程序员——反射

时间:2023-02-19 16:50:18

                                       ----------   android培训java培训、期待与您交流! ----------

Java中的反射从一个Class类的对象开始,根据这个Class对象可以获得一个类的全部成员列表,找出类的全部类型信息(),并可以发现关于类自身的一些信息,如它使用的修饰符()或它所在的包。Java中与反射相关的类出Class和Packge在java.lang包中外,其他均在java.lang.reflect包中。

Java中主要通过调用对象的getClass()方法、使用类的名字表达式、通过Class类的静态方法forName()三种方式获得Class类的对象。有了Class对象后。就可以调用Class类中的方法来获取类的父类,实现的接口、成员变量、成员方法和构造函数等信息,当然也可以使用newInstance()方法来创建对象。在实际使用中需要调用Method类、Field类和Constructor类中的方法完成某些操作,比如调用Method类的invoke()完成方法调用,调用Field类的set()方法修改成员变量的值,调用Constructor类的newInstance()方法创建类的实例等。

获取Class的方式:

使用getClass()方法获取Class对象实例。
package com.itheima.thread;

public class Class_Test {

	public static void main(String[] args) {

		java.awt.List a = new java.awt.List();

		E_getClass.showInterface(a);
	}

}

class E_getClass {

	public static boolean showInterface(Object object) {

		if (object == null)
			return false;
		/*
		 * 通过对象获得Class
		 */
		Class class1 = object.getClass();
		Class[] interFace = class1.getInterfaces();
		System.out.println("类"+class1.getName()+"继承的接口有:");
		for (int i = 0; i < interFace.length; i++)
			System.out.println(interFace[i].getName());
		return true;
	}

}
使用.class获取Class类的对象。
package com.itheima.thread;


public class Class_Test1 {
public static void main(String[] args) {
	Class cs = String.class;
	Class[] suClass = cs.getInterfaces();
	System.out.println("类"+cs.getName()+"继承的的接口有:");
	for (int i = 0; i < suClass.length; i++) {
		System.out.println(suClass[i].getName());
	}
	
}
}
使用forName()方法获取Class类的对象。
package com.itheima.thread;

import java.lang.reflect.Constructor;

public class Class_Test2 {

	public static void main(String[] args)throws Exception {
		Class class1 = Class.forName("java.util.Date");
		Class[] intfs = class1.getInterfaces();
		for (int i = 0; i < intfs.length; i++) {
			System.out.println(intfs[1].getName());
		}
		
		System.out.println("-----------------");
		Constructor[] constructors=class1.getConstructors();
		for(Constructor constructor:constructors)
			
		{  StringBuilder stringBuilder=new StringBuilder(constructor.getName()+"(");
            Class[] paramets=constructor.getParameterTypes();
            for (Class paramet:paramets) {
            	stringBuilder.append(paramet.getName()+",");
				
			}
            if(paramets.length>0)
            	stringBuilder.deleteCharAt(stringBuilder.length()-1);
            stringBuilder.append(")");
            System.out.println(stringBuilder);
		}
	}
	
	

}