Java反射

1.java中获得Class对象的三种方式

   1)使用Class类的forName静态方法,该方法需要传入字符串参数,其值是某个类的全限定类名

   2)调用某个类的class属性来获取该类对应的Class对象,如Person.class

   3)调用某个对象的getClass方法,该方法是java.lang.Object类中的方法,该方法返回对象所属类对应的Class对象

2.Class对象可以获得该类里包括的方法(由Method对象表示)、构造器(由Constructor对象表示)、Field(由Field

   对象表示),这三个类都定义在java.lang.reflect包下,并实现了java.lang.reflect.Member接口。

3.通过反射生成对象有两种方式

   1)使用Class对象的newInstance()方法来创建Class对象对应的类的实例,这种要求该Class对象对应的类有默认的

      构造器,而执行newInstance()方法实际上就是利用默认构造器来创建类的实例

public class ObjectPoolFactory
{
	private Map<String,Object> objectPool=new HashMap<String,Object>();
	
	private Object createObject(String clazzName) throws InstantiationException,IllegalAccessException,ClassNotFoundException
	{
		Class<?> clazz=Class.forName(clazzName);
		return clazz.newInstance();
	}
	
	public void initPool(String fileName) throws InstantiationException,IllegalAccessException,ClassNotFoundException
	{
		FileInputStream fis=null;
		try
		{
			fis=new FileInputStream(fileName);
			Properties props=new Properties();
			props.load(fis);
			for(String name:props.stringPropertyName())
			{
				objectPool.put(name,createObject(props.getProperty(name)));
			}
		}
		catch(IOException ex)
		{
			System.out.println("读取"+fileName+"异常");
		}
		finally
		{
			try
			{
				if(fis!=null)
				{
					fis.close();
				}
			}
			catch(IOException ex)
			{
				ex.printStackTrace();
			}
		}
	}
	
	public object getObject(String name)
	{
		return objectPool.get(name);
	}
	
	public static void main(String[] args) throws Exception
	{
		ObjectPoolFactory pf=new ObjectPoolFactory();
		pf.initPool("obj.txt");
		System.out.println(pf.getObject("a"));
	}
}

        obj.txt内容:

        a=java.util.Date

        b=javax.swing.JFrame

   2)先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建Class对象对应

      的类的实例。这种方式可以选择指定的构造器来创建实例      

public class CreateJFrame
{
	public static void main(String[] args) throws Exception
	{
		Class<?> jframeClazz=Class.forName("javax.swing.JFrame");
		Constructor ctor=jframeClazz.getConstructor(String.class);
		Object obj=ctor.newInstance("test_win");
		System.out.println(obj);
	}
}

4.当获得某个类对应的Class对象后,就可以通过Class对象的getMethods()方法或getMethod()方法来获取全部方法

   或指定方法。两个方法返回值一个是Method对象的数组,一个是Method的对象

   每个Method对象对应一个方法,可以使用Method对象的的invoke方法来执行对应的方法

   Object invoke(Object obj,Object...args):obj是执行方法的主调,args是执行方法传入该方法的实参

5.通过Method对象的invoke方法来调用对应的方法时,Java要求程序必须有调用该方法的权限。如果需要调用某个对

   象的private方法,可以先调用Method对象的如下方法:

   setAccessible(boolean flag):将Method对象的accessible标志设置为指示的布尔值。值为true则指示该Method在使

   用时应该取消Java语言访问权限。值为false则指示该Method在使用时应该实施Java语言访问权限检查

6.通过Class对象的getFields()或getField()方法可以获取该类所包含的全部Field或指定Field

    Field提供了两组方法来访问属性:

    getXxx(Object obj):获取obj对象该Field的属性值,此处Xxx对应8个基本类型,如果该属性的类型为引用类型则取消

                                   get后面的Xxx

    setXxx(Object obj,Xxx val):将obj对象的Field设置成val值,此处Xxx对应8个基本类型,如果该属性的类型为引用

                                               类型则取消set后面的Xxx

7.在java.lang.reflect包下还提供了一个Array类,可以通过Array动态的创建数组,操作数组元素

   static Object newInstance(Class<?> componentType,int...length):创建一个具有指定的元素类型,指定维度的数组

   static xxx getXxx(Object array,int index):返回array数组中第index个元素。xxx代表各基本类型,若数组元素为引用

                                                                    类型,则去掉xxx

  static void setXxx(Object array,int index,xxx val):将array数组中第index元素的值设为val。xxx代表各基本类型,若

                                                                                数组元素为引用类型,则去掉xxx


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值