Java反射机制

反射机制的应用


package com.iflysse.test04;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

import org.junit.Test;

/**
 *Java的反射机制:
 *	对象-->运行时类对象-->类的所有信息
 */
public class Day040601 {
	@SuppressWarnings("rawtypes")
	//由反射机制获取属性
	@Test
	public void test01() throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
		Person p = new Person();
		Class cla1 = p.getClass(); //通过对象名.getclass()的方式来获取类的运行时类对象;
		Class cla2 = Person.class; //通过类名.class的方式
		Class cla3 = Class.forName("com.iflysse.test04.Person"); //通过Class.forName("className")的方式
		
		//一个类只生成一个运行时类对象,不管用什么方法获取,都是一样的。
		System.out.println(cla1 == cla2);
		System.out.println(cla2 == cla3);
		
		//Field[]  field = cla1.getFields();//获取的是所有的公有的属性(包括父类的)
	    Field[]  field = cla1.getDeclaredFields(); //获取本类中所有的属性(不包括父类)
		for(Field ele:field){
			System.out.println(Modifier.toString(ele.getModifiers())+" "+ele.getType()+" "+ele.getName());
		}  //获取权限修饰符      获取数据类型   获取属性名
		
		//获取单个属性name
		Field fname = cla1.getField("name");
		fname.set(p, "小明");
		//获取age
		Field fage = cla1.getDeclaredField("age");
		fage.setAccessible(true);//私有属性对其赋值,将权限设置为true;
		
		fage.set(p, 22);
		p.info();
	}
	


----------


	//由反射机制获取方法
	@Test
	public void test02() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		Class cla = Person.class;
		
		Method[] methods = cla.getMethods();//获取所有的公有的方法,包括父类
		Method[] methods1 =cla.getDeclaredMethods(); //获取本类中所有的方法,包括私有
		for(Method ele:methods1){
			System.out.println(ele.getName());//方法名
			System.out.println(ele.getModifiers());//权限修饰符
			System.out.println(ele.getReturnType());//返回值类型
			System.out.println(Arrays.toString(ele.getParameterTypes()));//参数类型
			System.out.println(Arrays.toString(ele.getExceptionTypes()));//异常类型
			System.out.println(Arrays.toString(ele.getAnnotations()));
		}
		
		Person p = new Person();
		//...代表可以放0个或者多个参数
		Method m = cla.getMethod("show", String.class);
		m.invoke(p, "闪闪发亮"); // p.show("闪闪发亮");
		
		Method m1 = cla.getDeclaredMethod("xizao");
		m1.setAccessible(true);
		m1.invoke(p);
	}
	


----------


	//由反射机制创建对象
	@Test
	public void test03() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
		Class cla = Class.forName("com.iflysse.test04.Person");
		Person p = (Person) cla.newInstance();//一定要有无参构造函数
		
		System.out.println(cla.getSuperclass());//获取父类
		System.out.println(cla.getInterfaces());//获取接口
		System.out.println(cla.getPackage());
		
		Constructor[] constructors = cla.getDeclaredConstructors();
		
		//获取带参的构造器
		Constructor c1 = cla.getConstructor(String.class,int.class);
		Person p1 = (Person) c1.newInstance("小明",23);
		p1.info();
	}
}


----------


class Animals{
	public String name1;
	@SuppressWarnings("unused")
	private int age1;
}


----------


class Person extends Animals{
	public String name;
	private int age;
	
	
	public void setAge(int age) {
		this.age = age;
	}
	public Person(){}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public void info(){
		System.out.println("我是"+this.name+",今年"+this.age+"了...");
	}
	
	public void show(String str){
		System.out.println("我是一个"+str+"的人...");
	}
	private void xizao(){
		System.out.println("我爱洗澡,身体好好....");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值