java 反射

1、什么是反射

JAVA反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。


2、反射的作用

反射可以实现动态代理和IoC模式,具体参考相应的文章介绍

http://blog.csdn.net/pingnanlee/article/details/9123573

http://blog.csdn.net/pingnanlee/article/details/9419149


3、反射的基本方法

package com.basic.reflection;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class BasicReflectionTest {
	
	private String arg;
	private int index;
	
	public BasicReflectionTest() {
		System.out.println("construct function");
	}
	
	public BasicReflectionTest(String arg) {
		System.out.println("construct function " + arg);
		this.arg = arg;
	}
	
	public BasicReflectionTest(String arg, int index) {
		System.out.println("construct function " + arg);
		this.arg = arg;
		this.index = index;
	}
	
	public static void main(String argv[]) {
		
		try {
			String name = "test";
			Class<?> clsTest1 = name.getClass();
			System.out.println(clsTest1.getName() + " " + clsTest1.getSuperclass().getName());
						
			Class<?> clsTest2 = Class.forName("java.awt.Button");
			System.out.println(clsTest2.getName());
			
			Class<?> clsTest3 = BasicReflectionTest.class;
			System.out.println(clsTest3.getName());
			
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		
		try {
			Class<?> clsTest4 = Class.forName("com.basic.reflection.BasicReflectionTest");
			
			Field field[] = clsTest4.getDeclaredFields();
			for (int i = 0; i < field.length; i++) {
				System.out.println(Modifier.toString(field[i].getModifiers()) + " " + field[i].getType() + " " + field[i].getName());
			}
			
			Method ms[] = clsTest4.getDeclaredMethods();
			for (int i = 0; i < ms.length; i++) {
				System.out.println(ms[i]);
			}
			
			Constructor<?> cons[] = clsTest4.getConstructors();
			for (int i = 0; i < cons.length; i++) {
				System.out.println(cons[i]);
			}
			
			Class<?> inters[] = clsTest4.getInterfaces();
			for (int i = 0; i < inters.length; i++) {
				System.out.println(inters[i]);
			}
			
			Class<?> paras[] = ms[2].getParameterTypes();
			for (int i = 0; i < paras.length; i++) {
				System.out.println(paras[i]);
			}
			
			Class<?> exec[] = ms[2].getExceptionTypes();
			for (int i = 0; i < exec.length; i++) {
				System.out.println(exec[i]);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		try {
			Class<?> t = BasicReflectionTest.class;		
			BasicReflectionTest test = null;
			Object obj = t.newInstance();
			test = (BasicReflectionTest)obj;
			test.test1();
			
			Method mtest1 = t.getMethod("test1");
			mtest1.invoke(obj);
			
			Method mtest2 = t.getMethod("test2", int.class);
			mtest2.invoke(obj, 10);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void test1() {
		System.out.println("print test1");
	}
	
	public void test2(int i) throws IOException{
		System.out.println("print test2 " + i);
	}

	public String getArg() {
		return arg;
	}

	public void setArg(String arg) {
		this.arg = arg;
	}

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值