反射机制

public class Test2 {

	public static void main(String[] args) throws ClassNotFoundException {
		Class class1=Test2.class;//每个类都有class属性
		Class class2=new Test02().getClass();//每个对象都有getClass()
		Class class3=Class.forName("com.sky.homework.p11.Test2");
		
		Class<?>class4=int.class;
		Class<?>class5=Integer.class;
		System.out.println(class4==class5);//false
		
		Class<?>class6=Integer.TYPE;//TYPE返回的就是int基本类型
		
		Class<?>class7=Class.forName("com.sky.homework.p11.Person");
		//执行了静态代码块
	}
}
class Person{
	static{
		System.out.println("执行了静态代码块");
	}
}
import java.lang.reflect.Modifier;
public class Test3 {

	public static void main(String[] args) {
		//1)创建Class对象
		Class<?>class1=String.class;
		//创建String类class属性赋值给Class实例对象class1
		
		//2)
		//2.1修饰符
		int mod=class1.getModifiers();
		/*调用实例对象class1中的getModifiers()方法
		getModifiers()方法类型是基本整数类型*/
		
		String modifier=Modifier.toString(mod);
		//调用Modifier类中的toString,将其里面的参数int类型转化成字符串类型

		StringBuilder sb=new StringBuilder();
		//创建可变长参数对象,以便调用append()添加方法
		
		//2.2类名
		sb.append("class\t");//class
		sb.append(class1.getName());//java.lang.String,完整类名
		sb.append("\t"+class1.getSimpleName()+"\t");//String,简易类名
		
		//2.3父类
		Class<?>superclass=class1.getSuperclass();
		//得到class1属性的父类
		sb.append("\t"+superclass.getSimpleName()+"\t");
		
		//2.4接口
		Class<?>[] interfaces = class1.getInterfaces();
		if(interfaces.length>0){
			for(int i=0;i<interfaces.length;i++){
				sb.append("\t"+interfaces[i].getSimpleName()+"\t");
				/*class1是String类型,String接口如下
				Serializable		Comparable		CharSequence*/
			}
		}
		System.out.println(sb);
	}
}
import java.lang.reflect.Field;

  /*1)反射对象名.getField(字段名);         返回指定字段名必须是公共类型的
    2)反射对象名.getDeclaredField(字段名);  返回任意类型字段
          如int age设置成private私有的,在进行设置时须:
	  反射对象名.setAccessible(true);才可以再进行反射返回任意类型字段 */

public class Test {

	public static void main(String[] args) throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {
		Class<?>class1=Person1.class;
		//创建Class反射类,将Person字节码文件赋值给class1
		
		Field nameF = class1.getField("name");
		//通过class1反射对象获取文件字段,然后赋值给Field类对象nameF
		
		//通过反射技术创建对象(实例),默认调用类的无参构造
		Object p1 = class1.newInstance();
		//class1.newInstance();相当于p1
		
		nameF.set(p1, "张三");
		
		
		Field age = class1.getDeclaredField("age");
		age.set(p1, 18);
		
		System.out.println(p1);//姓名:张三, 年龄:18
	}

}
class Person1{
		public String name;//不加public报错
		int age;
		@Override
		public String toString() {
			return "姓名:" + name +", 年龄:" + age ;
		}
}
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//通过反射机制调用字节码文件方法以及设置属性
public class Test4 {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		Class<?>class1=Person2.class;
		//1)将字节码文件反射给Class类
		Object obj = class1.newInstance();
		//2)将字节码文件通过newInstance创建新的对象
		Method method = class1.getMethod("show", null);
		//3)调用Class类getMethod()方法获得字节码文件show方法
		Method set=class1.getMethod("set", String.class,int.class);
		//4)通过Class类中的getMthod方法获取class字节码字段属性
		set.invoke(obj, "张三",20);
		//5)在新的对象中设置属性
		method.invoke(obj);
		//6)调用Method.invoke打印新的对象obj
	}
}
class Person2{
	public String name;
	private int age;
	
	public void show(){
		System.out.println("姓名:"+name+",年龄:"+age);
	}
	public void set(String name, int age) {
		this.age = age;
		this.name = name;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值