反射(构造方法,方法,main,字段)

反射就是把Java类中的各种成分映射成相应的Java类

反射的基本步骤:

1、获得Class对象,就是获取到指定的名称的字节码文件对象。

2、实例化对象,获得类的属性、方法或构造函数。

3、访问属性、调用方法、调用构造函数创建对象。


被反射的Person类

<span style="font-size:24px;">package cn.itcast.reflect;

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

public class Person {
	public String name = "aaaaa";
	private int password;
	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= " + name + " password=" + 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);
	}

	// ------------------------------------反射main方法

	public static void main(String[] args) {
		System.out.println("main!!!!");
	}
}
</span>

加载类的字节码文件的3种方法

<span style="font-size:24px;">package cn.itcast.reflect;

public class Demo1 {

	/**
	 * 加载类的字节码
	 */
	public static void main(String[] args) throws Exception {

		// 1.
		Class clazz1 = Class.forName("cn.itcast.reflect.Person");

		// 2
		Class clazz2 = Person.class;

		// 3
		 Class clazz3 = new Person().getClass();
         
		 //(被反射的类,必须有无参的构造函数)
		 Person p = (Person) clazz1.newInstance();
	}

}
</span>


反射类的构造函数

<span style="font-size:24px;">package cn.itcast.reflect;

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类文件到内存中
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Constructor c = clazz.getConstructor(null);
		Person p = (Person) c.newInstance(null);// person
		System.out.println(p.name);// aaaa
	}

	// public Person(String name)
	@Test
	public void test2() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Constructor c = clazz.getConstructor(String.class);
		Person p = (Person) c.newInstance("abc");// person name
		System.out.println(p.name);// aaaaa
	}

	// public Person(String name,int password)
	@Test
	public void test3() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Constructor c = clazz.getConstructor(String.class, int.class);
		Person p = (Person) c.newInstance("abc", 999);// abc:999
		System.out.println(p.name);// aaaaa
	}

	// private Person(List list)
	@Test
	public void test4() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Constructor c = clazz.getDeclaredConstructor(List.class);
		c.setAccessible(true);// 暴力反射,统统打开访问权限
		Person p = (Person) c.newInstance(new ArrayList());// list
		System.out.println(p.name);// aaaa
	}

	// 创建对象的另外一种途径,无参构造方法,等效test1
	@Test
	public void test5() throws ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Person p = (Person) clazz.newInstance();
		System.out.println(p);
	}
}
</span>


反射类的方法,main方法

<span style="font-size:24px;">package cn.itcast.reflect;

import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Arrays;

import org.junit.Test;

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

	// 反射类的方法: public void aa1()
	@Test
	public void test1() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Method method = clazz.getMethod("aa1", null);// 第一个参数是被反射方法的名字,第二个参数是被反射方法的参数。
		Person p = new Person();// person
		method.invoke(p, null);// 第一个参数:调用谁的对象的方法;第2个参数:方法所传递的参数

	}

	// public void aa1(String name,int password)
	@Test
	public void test2() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Method method = clazz.getMethod("aa1", String.class, int.class);// 第一个参数是被反射方法的函数名,第二个参数是被反射方法的参数。
		Person p = new Person();// person
		method.invoke(p, "xxxx", 99);// name= xxxx password=99
	}

	// public Class[] aa1(String name,int[] password)
	@Test
	public void test3() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Method method = clazz.getMethod("aa1", String.class, int[].class);
		Person p = new Person();// person
		Class cs[] = (Class[]) method.invoke(p, "xxxx", new int[] { 1, 2, 3 });// name=
																				// xxxx
																				// password=99
		System.out.println(cs[0]);// class java.lang.String
	}

	// private void aa1(InputStream in)
	@Test
	public void test4() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Method method = clazz.getDeclaredMethod("aa1", InputStream.class);
		method.setAccessible(true);
		Person p = new Person();// person
		method.invoke(p, new FileInputStream("C:\\1.txt"));//

	}

	// public static void aa1(int num)
	@Test
	public void test5() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Method method = clazz.getMethod("aa1", int.class);
		method.invoke(null, 777);// 777 静态方法调用不需要对象,给对象也行
	}

	// public static void main(String []args){}//重点
	@Test
	public void test6() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Method method = clazz.getMethod("main", String[].class);
		// method.invoke(null,new String[]{"a","c"});//Wrong
		// method.invoke(null,"a","c");//Wrong

		String[] str = { "x", "y", "z" };
		method.invoke(null, (Object) str);
		method.invoke(null, new Object[] { new String[] { "a", "c" } });
		method.invoke(null, (Object) new String[] { "a", "c" });

	}
}
</span>

反射类的字段

<span style="font-size:24px;">package cn.itcast.reflect;

import org.junit.Test;
import java.lang.reflect.Field;

//反射类的字段
public class Demo4 {
	// public String name="aaaa";
	@Test
	public void test1() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Field f = clazz.getField("name");
		Person p = new Person();
		Object value = f.get(p);// 获取字段值
		Class type = f.getType();// 字段类型
		System.out.println(type);// class java.lang.String

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

		// 设置值
		f.set(p, "XXXXXXXXXXXX");
		System.out.println(p.name);// XXXXXXXXXXXX

	}

	// private int password;
	@Test
	public void test2() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Field f = clazz.getDeclaredField("password");
		f.setAccessible(true);
		Person p = new Person();
		f.set(p, 123);
		System.out.println(f.get(p));// 123
	}

	// private static int age=23;
	@Test
	public void test3() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Field f = clazz.getDeclaredField("age");
		f.setAccessible(true);
		System.out.println(f.get(null));// 23
	}
}
</span>


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值