java反射基础

 1,三种获得Class对象的方法

@Test
	public void test1() throws Exception{
		
		//类名.class
		Class c1 = String.class;
		
		//对象名.getClass()
		Class c2 = new String().getClass();
		
		//Class.forName("类的完整路径")
		Class c3 = Class.forName("java.lang.String");
		
		//相等
		if(c2==c3){
			System.out.println("相等");
		}
	}

 

2,构造方法创建对象

public class Demo2 {
	//用反射方法通过空参构造方法创建一个对象
	@Test 
	public void test1(){
		try {
			Class clazz = Class.forName("cn.itcast.java.reflect.Person");
			//取得构造方法
			Constructor c = clazz.getConstructor(null);
			//创建实例
			Person person = (Person)c.newInstance(null);
			//调用业务方法
			person.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//用反射方法通过有参构造方法创建一个对象
	@Test
	public void test2(){
        
		try {
			Class clazz = Class.forName("cn.itcast.java.reflect.Person");
			//取得构造方法[参数类型的Class对象]
			Constructor c = clazz.getConstructor(String.class,int.class);
			//创建实例[真实参数]
			Person person = (Person)c.newInstance("jack",31);
			//调用业务方法
			person.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//用反射方法通过私有构造方法创建一个对象
	@Test
	public void test3(){
		try {
			Class clazz = Class.forName("cn.itcast.java.reflect.Person");
			//取得类中声明的所有构造方法(包含private或protected)
			Constructor c = clazz.getDeclaredConstructor(String.class,String[].class);
			//设置该private的构造方法是否可以被访问
			c.setAccessible(true);
			Person person = (Person) c.newInstance("jack",new String[]{"唱歌","跳舞"});
			person.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//用反射方法通过私有空参构造方法创建一个对象
	@Test
	public void test4(){
		try {
			Class clazz = Class.forName("cn.itcast.java.reflect.Person");
			Constructor c = clazz.getDeclaredConstructor(null);
			c.setAccessible(true);
			Person person = (Person) c.newInstance(null);
			person.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


3.字段反射

@Test
	public void test1() throws Exception{
		Person p = new Person();
		Class clazz = Class.forName("cn.itcast.java.reflect.Person");
		//取得字段[字段的名字]
		Field f = clazz.getField("name");
		//向字段存值[引用变量名,真实值]
		f.set(p,"jack");//new Person().setName("jack")
		//取得字段的值
		System.out.println("用户名:" + p.name);
	}
	@Test
	public void test2() throws Exception{
		Person p = new Person();
		Class clazz = Class.forName("cn.itcast.java.reflect.Person");
		Field f = clazz.getDeclaredField("age");
		f.setAccessible(true);
		f.set(p,"31");
		System.out.println("年龄:" + p.getAge());
	}

4,方法反射

@Test
	public void test1() throws Exception{
		Class clazz = Class.forName("cn.itcast.java.reflect.Person");
		//参数一:方法名
		//参数二:方法参数对应的Class对象
		Method m = clazz.getMethod("show",null);
		//参数一:引用变量
		//参数二:真实值
		m.invoke(new Person(),null);
	}
	@Test
	public void test2() throws Exception{
		Class clazz = Class.forName("cn.itcast.java.reflect.Person");
		//参数一:方法名
		//参数二:方法参数对应的Class对象
		Method m = clazz.getMethod("show",String.class,int.class);
		//参数一:引用变量
		//参数二:真实值
		m.invoke(new Person(),"jack",31);
	}
	@Test
	public void test3() throws Exception{
		Class clazz = Class.forName("cn.itcast.java.reflect.Person");
		//参数一:方法名
		//参数二:方法参数对应的Class对象
		Method m = clazz.getMethod("show",int[].class);
		//参数一:引用变量
		//参数二:真实值
		String value = (String) m.invoke(new Person(),new int[]{1,2,3,4});
		System.out.println("value=" + value);
	}
	@Test
	public void test4() throws Exception{
		Class clazz = Class.forName("cn.itcast.java.reflect.Person");
		//参数一:方法名
		//参数二:方法参数对应的Class对象
		Method m = clazz.getDeclaredMethod("hello",String.class);
		//参数一:引用变量
		//参数二:真实值
		m.setAccessible(true);
		int value = (Integer) m.invoke(new Person(),"marry");
		System.out.println("value=" + value);
	}


5,主函数反射

	public static void main(String[] args) throws Exception {
		Class clazz = Class.forName("cn.itcast.java.reflect.Person");
		Method m = clazz.getMethod("main",String[].class);
		//如果是静态类型,参数一为null。
		//m.invoke(null,new String[]{"A","C","D","E"});
		//m.invoke(null,new Object[]{new String[]{"A","C","D","E"}});
		m.invoke(null,(Object)new String[]{"A","C","D","E"});
	}




 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值