`

java反射实例

    博客分类:
  • java
阅读更多
1,创建Person类
package reflect;

import java.io.InputStream;
import java.util.List;

public class Person {
	
	public String name="aaaaa";
	private int password;
	private static int age;
	
	public Person() {
		System.out.println("person");
	}
	
	public Person(String name){
		System.out.println("person "+name);
	}
	
	public Person(String name,int password){
		System.out.println("person "+name+":"+password);
	}
	
	private Person(List<?> list){
		for(int i=0;i<list.size();i++){
			System.out.println("person "+list.get(i));
		}
	}
	
	public void aa1(){
		System.out.println("aa1");
	}
	
	public void aa1(String name,int password){
		System.out.println("aa1 "+name+":"+password);
	}
	
	public Class[] aa1(String name,int[] password){
		return new Class[]{String.class};
	}
	
	private void aa1(InputStream in){
		System.out.println(in);
	}
	
	public static void aa1(int num){
		System.out.println(num);
	}
	
	public static void main(String[] args){
		System.out.println("main");
		for(int i=0;i<args.length;i++){
			System.out.println(args[i]);
		}
	}
}



2,反射测试类
package reflect;

import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

/**
 * java反射
 * 加载类三种方式:
 * 1、Class c=Class.forName("reflect.Person");
 * 2、Class c=new Person().getClass();
 * 3、Class c=Person.class;
 * 
 */
public class DemoTest {
	
	/**
	 * 调无参构造 
	 */
	@Test
	public void constructor1() throws Exception{
		Class c=Class.forName("reflect.Person");
		Constructor cs=c.getConstructor(null);//null表示无参构造,null也可以不写
		Person p=(Person) cs.newInstance(null);//调用无参构造函数创建实例,null可以不写
		System.out.println(p.name);
	}
	
	/**
	 * 调有参构造Person(String name) 
	 */
	@Test
	public void constructor2() throws Exception{
		Class c=Class.forName("reflect.Person");
		Constructor cs=c.getConstructor(String.class);//创建有参构造,参数类型为String
		Person p=(Person) cs.newInstance("xxxx");//调用Person(String name)构造创建实例,xxxx可为任意字符串
		System.out.println(p.name);
	}
	
	/**
	 * 调有参构造Person(String name,int password) 
	 */
	@Test
	public void constructor3() throws Exception{
		Class c=Class.forName("reflect.Person");
		Constructor cs=c.getConstructor(String.class,int.class);//创建有参构造,参数类型为String,int
		Person p=(Person) cs.newInstance("xxxx",11);//调用Person(String name,int password)构造创建实例,xxxx可为任意字符串,11可为任意数字
		System.out.println(p.name);
	}
	
	/**
	 * 调私有构造private Person(List list) 
	 * 理论上私有方法外部类不可以访问,但是反射可以做到
	 */
	@Test
	public void constructor4() throws Exception{
		
		List<String> list=new ArrayList<String>();
		list.add("aaa");
		list.add("bbb");
		list.add("ccc");
		
		Class c=Class.forName("reflect.Person");
		Constructor cs=c.getDeclaredConstructor(List.class);//私有构造用getDeclaredConstructor获取
		cs.setAccessible(true);//爆力反射,可以访问私有方法
		Person p=(Person) cs.newInstance(list);
		System.out.println(p.name);
	}
	
	/**
	 * 无参构造第二种调用方式 
	 */
	@Test
	public void constructor5() throws Exception{	
		Class c=Class.forName("reflect.Person");
		Person p=(Person) c.newInstance();
		System.out.println(p.name);
	}
	
	/**
	 * 调public void aa1()方法
	 */
	@Test
	public void method1() throws Exception{
		
		Person person=new Person();
		
		Class c=Class.forName("reflect.Person");
		Method method=c.getMethod("aa1", null);//访问aa1方法,参数为null
		method.invoke(person, null);//指定调哪个对象的方法,参数为null
	}
	
	/**
	 * 调public void aa1(String name,int password)方法
	 */
	@Test
	public void method2() throws Exception{
		
		Person person=new Person();
		
		Class c=Class.forName("reflect.Person");
		Method method=c.getMethod("aa1", String.class,int.class);
		method.invoke(person, "TOM",32);
	}
	
	/**
	 * 调public Class[] aa1(String name,int[] password)方法 
	 */
	@Test
	public void method3() throws Exception{
		
		Person person=new Person();
		
		Class c=Class.forName("reflect.Person");
		Method method=c.getMethod("aa1", String.class,int[].class);
		Class[] cs=(Class[]) method.invoke(person,"Jack", new int[]{1,23});
		System.out.println(cs[0]);
	}
	
	/**
	 * 调private void aa1(InputStream in)方法 
	 */
	@Test
	public void method4() throws Exception{
		
		Person person=new Person();
		InputStream is=new FileInputStream("D:\\work\\struts2\\src\\struts.xml");
		
		Class c=Class.forName("reflect.Person");
		Method method=c.getDeclaredMethod("aa1", InputStream.class);//访问私有方法用getDeclaredMethod
		method.setAccessible(true);
		method.invoke(person, is);
	}
	
	/**
	 * 调public static void aa1(int num) 
	 */
	@Test
	public void method5() throws Exception{
		
		Class c=Class.forName("reflect.Person");
		Method method=c.getMethod("aa1", int.class);//访问私有方法用getDeclaredMethod
		method.invoke(null, 23);//静态方法调用不需要传对象
	}
	
	/**
	 * 反射创建实例并调用方法
	 */
	@Test
	public void method6() throws Exception{
		Class c=Class.forName("reflect.Person");
		Constructor cs=c.getConstructor(null);
		Person p=(Person) cs.newInstance(null);
		Method m=c.getMethod("aa1", String.class,int.class);
		m.invoke(p, "Lucy",45);
	}
	
	/**
	 * 反射调main方法 
	 */
	@Test
	public void method7() throws Exception{
		Class c=Class.forName("reflect.Person");
		Method method=c.getMethod("main", String[].class);
		//method.invoke(null, new Object[]{new String[]{"aaa","bbb"}});//这里和其他方法不同,比较奇葩,两种调用方式
		method.invoke(null, (Object)new String[]{"aaa","bbb"});
	}
	
	/**
	 * 反射字段属性 public String name="aaaaa";
	 */
	@Test
	public void property1() throws Exception{
		
		Person person=new Person();
		
		Class c=Class.forName("reflect.Person");
		Field field = c.getField("name");//获取名为"name"的字段
		
		Class<?> type = field.getType();
		System.out.println(type);//得到字段类型
		
		String name=(String) field.get(person);
		System.out.println(name);//得到字段值
		
		//Object value=field.get(person);
		//Class<?> type2 = field.getType();
		//if(String.class.equals(type2)){
		//	String sValue=(String)value;
		//	System.out.println(sValue);
		//}
		
		field.set(person, "bbbb");//给该字段赋值为bbbb
		System.out.println(person.name);
	}
	
	/**
	 * 反射私有属性private int password;
	 */
	@Test
	public void property2() throws Exception{
		
		Person person=new Person();
		
		Class c=Class.forName("reflect.Person");
		Field field = c.getDeclaredField("password");
		field.setAccessible(true);
		field.set(person, 123456);
		int password = (Integer) field.get(person);
		System.out.println(password);
	}
	
	/**
	 * 反射私有静态属性private static int age;
	 */
	@Test
	public void property3() throws Exception{
		Class c=Class.forName("reflect.Person");
		Field field = c.getDeclaredField("age");
		field.setAccessible(true);
		field.set(null, 87);
		int age = (Integer) field.get(null);
		System.out.println(age);
	}
}


分享到:
评论

相关推荐

    java反射实例代码

    一个java普通工程,反射的所有方法和实例都有,,另外还有注释,可以帮助理解

    Java反射实例源码

    Java反射实例源码,具体讲解内容见博客http://blog.csdn.net/liushuijinger 菜鸟学编程(九)——Java反射机制(一) 菜鸟学编程(十)——Java反射机制(二)

    java 反射实例,大量注释,简单易懂

    一个java反射的例子,通过java反射机制,动态生成java实例,动态执行方法。例子中有大量注释,简单易懂。

    Java 8个反射实例

    Java 8个反射实例 项目实例 项目工程

    java 反射 实例

    java 反射 的 实例介绍 个人笔记

    Java反射经典实例

    Java反射经典实例 Java反射经典实例 Java反射经典实例 Java反射经典实例

    java反射实例.

    反射入门小程序.通过反射机制执行JavaBean的get和set方法.

    Java反射简单小实例

    Java反射实例,可以给初学反射的同志们一定帮助。一个简单实例,可以更好的理解反射的规矩。

    Java反射实例

    常用的属性,方法和构造函数的获取实例,个人实际学习总结,亲测有效!

    java反射实例学习

    很好的几个反射的例子,看后就明白什么是反射了,反射机制怎么用了

    反射实例-JAVA反射机制.doc

    反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc...

    java反射经典实例

    java反射经典实例 看完之后,基本满足你要做的事情,其中包括修改各种私有属性,调用私有方法的例子代码。简单干练。

    Spring IOC 原理 ,Java 反射实例,自定义注解

    NULL 博文链接:https://zyqwst.iteye.com/blog/2255560

    Java反射机制总结

    这是一本关于Java反射机制论文集合的书。其中包含基本的理论及各种实例。... 关键字有:Java Java反射机制 Java反射 Java反射理论 Java反射实例 Java反射例子 反射原理 反射 网络论文 集合 汇总 总结 Class。

    Java 反射机制 代码的实例

    Java 反射机制 代码的实例 请认真阅读 运行此代码 只要读懂了 反射机制也就明白了

    Java反射应用实例

    代码主要实现了Java反射应用实例, 包含利用反射方法创建对象(使用默认构造函数和自定义构造函数),访问对应对象的方法(包括带参数的和不带参数的),访问对应对象的域(Field). 从这里可以看到代码的详细解说:...

Global site tag (gtag.js) - Google Analytics