zoukankan      html  css  js  c++  java
  • Java -- 反射示例

    1. 反射: 即加载和解剖, 用于设计框架, 读取配置档 动态创建对象。

    Person类,用于反射。

    package com.kevin.class_test;
    
    public class Person {
    	
    	public String namestr="aaaa";
    	
    	public Person()
    	{
    		System.out.println("public constructor");
    	}
    	private Person(String name)
    	{
    		System.out.println("private constructor " + name);		
    	}
    	public Person(String name1, String name2)
    	{
    		System.out.println("public constructor " + name1 + name2);
    	}
    	
    	public void fun()
    	{
    		System.out.println("in fun: " + namestr);
    	}
    	
    	public String fun(String name)
    	{
    		System.out.println("in fun: " + namestr + name);
    		return "Yes";
    	}
    	
    	public static void main(String[] args)
    	{
    		System.out.println("in main");
    		for(String str : args)
    		{
    			System.out.println(str);
    		}
    	}
    }
    


    反射的使用实例, 使用Junit测试

    package com.kevin.class_test;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class JunitTest {
    
    	Class clazz = null;  //建立Class对象
    
    	@Before
    	public void before() throws Exception  //初始化@before 
    	{
    		System.out.println("before");
    		clazz = Class.forName("com.kevin.class_test.Person");  //加载类,一定要用类全名
    	}
    		
    	@Test
    	public void test() throws Exception {		
    		Person person = (Person) clazz.newInstance();  //反射实例化对象
    		person.fun();
    	}
    
    	@Test
    	public void test2() throws Exception {		
    		Constructor cons = clazz.getDeclaredConstructor(String.class);  //反射获取private方法
    		cons.setAccessible(true);      //改变private属性
    		Person person = (Person) cons.newInstance("kevin");  //使用获取的构造器 实例化对象
    		person.fun();
    	}
    	
    	@Test
    	public void test3() throws Exception {
    		Person p = new Person();
    		Method method = clazz.getMethod("fun", String.class);    //反射获取public方法
    		String result = (String) method.invoke(p, "xiang");   
    		System.out.println("result: " + result);
    	}
    		
    	@Test
    	public void test4() throws Exception {	
    		Method method = clazz.getMethod("main", String[].class);  //反射获取main方法
    		method.invoke(null, (Object)new String[]{"a","b"});     //必须将String[]掩饰为Object,不然会参数异常报错
    	}
    	
    	@Test
    	public void test5() throws Exception {	
    		Person p = new Person();
    		Field field = clazz.getField("namestr");          //反射获取属性 
    		Object value = field.get(p);           //获取属性值
    		Class type = field.getType();          //获取属性值类型
    		if( type.equals(String.class) )
    		{
    			String str = (String)value;     //类型转换
    			System.out.println("str: " + str);			
    		}
    		field.set(p, "bbbb");         //修改属性
    		System.out.println("str: " + p.namestr);
    	}
    		
    	
    	@After
    	public void after()
    	{
    		System.out.println("atfer");
    	}
    }
    

  • 相关阅读:
    数组方法延伸
    Vue基础知识之过滤器(四)
    Vue基础知识之vue-resource和axios(三)
    【正则】对RegExp执行typeof运算的结果
    【正则】所有的字符(总)
    学习正则有感by魔芋(命名问题)
    关于正则表达式(转)
    【15】ES6 for Humans: The Latest Standard of JavaScript: ES2015 and Beyond
    中国首届CSS开发者大会讲师照片
    拥有强大的自我驱动力是一种怎样的体验?
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648165.html
Copyright © 2011-2022 走看看