您现在的位置:首页 >> 前端 >> 内容

反射

时间:2017/2/25 12:01:42 点击:

  核心提示:1.反射 : 加载类并剖解类的各个组成部分(1.构造函数 2.方法 3.字段)待剖解类Person.javaimport java.io.InputStream;import java.util.Li...

1.反射 : 加载类并剖解类的各个组成部分(1.构造函数 2.方法 3.字段)

待剖解类Person.java

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

public class Person {

	public String name = "haha";
	private int password = 123;
	private static int age = 23;

	public Person() {
		System.out.println("Person");
	}

	public Person(String name) {
		System.out.println(name);
	}

	public Person(String name, int password) {
		System.out.println(name + ":" + password);
	}

	private Person(List list) {
		System.out.println("list");
	}

	public void aa1() {
		System.out.println("aa1");
	}

	public void aa1(String name, int password) {
		System.out.println(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 !!!");
	}
}
反射构造函数,目的创建类对象

 

 

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

//解剖构造函数 ,创建类的对象
public class Demo2 {

	// 反构造函数 public Person()
	@Test
	public void test1() throws Exception {
		Class clazz = Class.forName("com.reflect.Person");
		Constructor c = clazz.getConstructor(null);

		Person p = (Person) c.newInstance(null);
		System.out.println(p.name);
	}

	// 反构造函数 public Person(String name)
	@Test
	public void test2() throws Exception {
		Class clazz = Class.forName("com.reflect.Person");
		Constructor c = clazz.getConstructor(String.class);
		Person p = (Person) c.newInstance("xxx");
		System.out.println(p.name);

	}

	// 反构造函数 public Person(String name,int password)
	@Test
	public void test3() throws Exception {
		Class clazz = Class.forName("com.reflect.Person");
		Constructor c = clazz.getConstructor(String.class, int.class);
		Person p = (Person) c.newInstance("xxx", 12);
		System.out.println(p.name);

	}

	// 反构造函数 private Person(List list)
	@Test
	public void test4() throws Exception {
		Class clazz = Class.forName("com.reflect.Person");
		Constructor c = clazz.getDeclaredConstructor(List.class);
		c.setAccessible(true);
		Person p = (Person) c.newInstance(new ArrayList());
		System.out.println(p.name);
	}

	// 创建对象的另一种途径,与test1等效
	@Test
	public void test5() throws Exception {
		Class clazz = Class.forName("com.reflect.Person");
		Person p = (Person) clazz.newInstance();
		System.out.println(p.name);
	}
}

反射方法,目的创建类方法
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;

import org.junit.Test;

//反射类的方法
public class Demo3 {

	// public void aa1()
	@Test
	public void test1() throws Exception {

		Person p = new Person();

		Class clazz = Class.forName("com.reflect.Person");
		Method method = clazz.getMethod("aa1", null);
		method.invoke(p, null);
	}

	// public void aa1(String name,int password)
	@Test
	public void test2() throws Exception {

		Person p = new Person();

		Class clazz = Class.forName("com.reflect.Person");
		Method method = clazz.getMethod("aa1", String.class, int.class);
		method.invoke(p, "xxx", 38);
	}

	// public void aa1(String name,int password)
	@Test
	public void test3() throws Exception {

		Person p = new Person();

		Class clazz = Class.forName("com.reflect.Person");
		Method method = clazz.getMethod("aa1", String.class, int.class);
		method.invoke(p, "xxx", 38);
	}

	// public Class[] aa1(String name,int[] password)
	@Test
	public void test4() throws Exception {

		Person p = new Person();

		Class clazz = Class.forName("com.reflect.Person");
		Method method = clazz.getMethod("aa1", String.class, int[].class);
		Class[] cs = (Class[]) method.invoke(p, "aaa", new int[] { 1, 2, 3 });
		System.out.println(cs[0]);
	}

	// private void aa1(InputStream in)
	@Test
	public void test5() throws Exception {

		Person p = new Person();

		Class clazz = Class.forName("com.reflect.Person");
		Method method = clazz.getDeclaredMethod("aa1", InputStream.class);
		method.setAccessible(true);
		method.invoke(p, new FileInputStream("C:\\1.txt"));

	}

	// public static void aa1(int num)
	@Test
	public void test6() throws Exception {

		Person p = new Person();
		Class clazz = Class.forName("com.reflect.Person");

		Method method = clazz.getMethod("aa1", int.class);
		method.invoke(null, 23);
	}

	//public static void main(String[] args)
	@Test
	public void test7() throws Exception {

		Class clazz = Class.forName("com.reflect.Person");

		Method method = clazz.getMethod("main",String[].class);
//		method.invoke(null,new Object[]{new String[]{"aa","123"}});
		method.invoke(null, (Object)new String[]{"aa","123"});
	}
}
反射字段,目的封装对象
import java.lang.reflect.Field;

import org.junit.Test;

//反射字段
public class Demo4 {

	// 反射字段:public String name = "haha";
	@Test
	public void test1() throws Exception {

		Person p = new Person();

		Class clazz = Class.forName("com.reflect.Person");
		Field f = clazz.getField("name");

		Object obj = f.get(p); // 获取字段值
		Class type = f.getType(); // 获取字段类型

		if (type.equals(String.class)) {
			String value = (String) obj;
			System.out.println(value);
		}

		// 设置字段的值
		f.set(p, "XXXXXXXX");
		System.out.println(p.name);
	}

	// 反射字段:private int password;
	@Test
	public void test2() throws Exception {

		Person p = new Person();

		Class clazz = Class.forName("com.reflect.Person");
		Field f = clazz.getDeclaredField("password");
		f.setAccessible(true);

		System.out.println(f.get(p));
	}

	// 反射字段:private static int age = 23;;
	@Test
	public void test3() throws Exception {

		Person p = new Person();

		Class clazz = Class.forName("com.reflect.Person");
		Field f = clazz.getDeclaredField("password");
		f.setAccessible(true);

		System.out.println(f.get(p));
	}
}

Tags:反射   
作者:网络 来源:liandheng的