Java反射案例

一、简单的反射例子

  
    /**    
    * @Title: ReflectTest.java  
    * @Package com.lss.wy  
    * @Description: TODO 
    * @author Licon  
    * @date 2018年8月14日  
    * @version V1.0    
    */  
    
package com.lss.wy;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**  
    * @ClassName: ReflectTest 反射  
    * @Description: TODO  
    * @author Licon  
    * @date 2018年8月14日  
    *    
    */

public class ReflectTest {
	//动态传入一个方法名,根据类名来构建类的实例对象 
	public static void desc(String name) throws ClassNotFoundException {
			/*
			 * 获取内存当中实实在在存在的person这个类的对象
			 * Person p =new Person();
			System.out.println(p.getClass());*/
		Class<?> cls = Class.forName("com.lss.wy.Test");
		//获取包名
		System.out.println(cls.getPackage()+";");
		//获取修饰符 +类名
		System.out.println(Modifier.toString(cls.getModifiers())+" class "+cls.getSimpleName()+"{");
		//反射属性、方法、构造器
		/**
		 * getField(name) 获取对应名称的属性,前提(必须是public)
		 * getFields():获取所有public修饰的属性
		 * getDeclaredField(name)获取对应名称的属性,任意的修饰符
		 * getDeclaredFields 获取任意修饰符的属性
		 */
		Field[] fields = cls.getDeclaredFields();
		if(fields != null && fields.length > 0) {
			for (Field field : fields) {
				System.out.println("属性:"+field);
			}
		}
		//获取类中所有方法
		Method[] methods = cls.getDeclaredMethods();
		if(methods != null && methods.length > 0) {
			for (Method method : methods) {
				System.out.println("方法:"+method);
			}
		}
		//获取类中所有构造器
		Constructor<?>[] constructors = cls.getDeclaredConstructors();
		if(constructors != null && constructors.length > 0) {
			for (Constructor<?> constructor : constructors) {
				System.out.println("构造器:"+constructor);
			}
		}
		System.out.println("}");
	}
	public static void main(String[] args) throws ClassNotFoundException {
		//通过反射获取到这个类对象
		desc(args[0]);
		
	}
}
    /**    
    * @Title: Test.java  
    * @Package com.lss.wy  
    * @Description: TODO 
    * @author Licon  
    * @date 2018年8月14日  
    * @version V1.0    
    */  
package com.lss.wy;
    /**  
    * @ClassName: Test  
    * @Description: TODO  
    * @author Licon  
    * @date 2018年8月14日  
    *    
    */
public class Test {
	public int id;
	protected String name;
	int age;
	private String adress;
	
	
	public Test() {
	}
	public Test(int id, String name, int age, String adress) {
		this.id = id;
		this.name = name;
		this.age = age;
		this.adress = adress;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAdress() {
		return adress;
	}
	public void setAdress(String adress) {
		this.adress = adress;
	}
	@Override
	public String toString() {
		return "Test [id=" + id + ", name=" + name + ", age=" + age + ", adress=" + adress + "]";
	}
	
	
}

 二、反射中需要注意的地方

    /**    
    * @Title: ReflectTest2.java  
    * @Package com.lss.wy 
    * @Description: TODO 
    * @author Licon  
    * @date 2018年8月15日  
    * @version V1.0    
    */  
package com.lss.wy;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.lss.wy.Test;

/**  
    * @ClassName: ReflectTest2  
    * @Description: TODO  
    * @author Licon  
    * @date 2018年8月15日  
    *    
    */
//使用反射调用类对象中的内容
public class ReflectTest2 {
	public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
		Test t = new Test();
		//反射可以构建新对象
		Class<? extends Test> cls = t.getClass();
		//获取有参构造器
		Constructor<? extends Test> constructor = cls.getDeclaredConstructor(int.class,String.class,int.class,String.class);
		Test newInstance = constructor.newInstance(1,"wy",22,"hcz");
		System.out.println(newInstance.toString());
		//getMethod方法中有两个参数
		//第一个:表示想要获取的方法名
		//第二个:如果该方法需要传参,参数类型写到此处
		Method method = cls.getMethod("getName");
		/**invoke():执行方法
		 * 第一个:哪个对象执行
		 * 第二个:传入的值
		 */
		System.out.println(method.invoke(newInstance));		
		
		
		/**
		 * 获取属性
		 */
		Field adress = cls.getDeclaredField("adress");
		//暴力访问,默认为false,不可访问private修饰的内容
		adress.setAccessible(true);
		Object ad = adress.get(newInstance);
		System.out.println(ad);
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_31987435/article/details/81744601