java基础学习日志19

反射



public class Student extends Person {
	public String name;
	private int age;
	private String sex;
	protected String address;
	public String school;
	public Student(String name, int age, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
		System.out.println("有三个参数的构造方法");
	}
	public Student(String name,int age){
		this.name=name;
		this.age=age;
		System.out.println("有两个参数的构造方法");
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
	private Student(int age,String sex) {
		this.age=age;
		this.sex=sex;
		System.out.println("有age,sex参数的私有构造方法");
	}
	public Student() {
		System.out.println("这个是默认的无参构造方法");
	}
	 public String getName() {
	 return name;
	 }
	public void sleep(long time) {
		System.out.println("this is Student sleep()"+time);
	}
	private void sleep(String name,long time) {
		System.out.println(name+"睡了"+time+"个小时");
	}
	public void setName(String name) {
		this.name = name;
	}

	 public int getAge() {
	 return age;
	 }
	public void setAge(int age) {
		this.age = age;
	}

	 public String getAddress() {
	 return address;
	 }
	private void setAddress(String address) {
		this.address = address;
	}
	 @Override
	 public void run(){
	
	 }
	private void run1(){
	
	 }
}



public class Address {
	String province;
	String city;
	String street;
	String number;
	public Address(String pro,String city,String str,String number) {
		this.province=pro;
		this.city=city;
		this.street=str;
		this.number=number;
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	
}





public class Person {
	public String schoolName;
	public void sleep(long time){
		
	}
	public void run(){
		
	}
}

public interface InterfaceDemo {
	public void eat();
}

参数、方法、构造方法


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 获取class对象的三种方式
 * @author 
 * @date 2018年2月6日上午9:45:59
 */
public class Test {
	public static void main(String[] args) {
////		获取class对象的第一种方式:通过类名.class
//		Class className = Student.class;
//		Class c1 = int.class;
//		Class c2 = int[].class;
//		System.out.println(className.getName());
//		System.out.println(className.getSimpleName());
//		System.out.println(className.getCanonicalName());
////		通过对象名或class
//		
//		Student stu = new Student("俊成", 16, "甘肃武威");
//		Class className1 = stu.getClass();
//		System.out.println(className1.getName());
//		System.out.println(className1.getSimpleName());
//		System.out.println(className1.getCanonicalName());
//		System.out.println("--------------------------------------------------------------");
////		通过class类的fromname方法
//		try {
//			Class className2 = Class.forName("com.hisoft.java.reflect.Student");
//			System.out.println(className2.getName());
//			System.out.println(className2.getSimpleName());
//			System.out.println(className2.getCanonicalName());
//		} catch (ClassNotFoundException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		
////		获取父类的类名可用通过getSuperClass()这个方法
//		Class sperClass = Student.class.getSuperclass();
//		System.out.println(sperClass.getName());
////		获取该类对应的接口Class对象,获取的是接口类型的数组
//		Class[] interfaceClass = Student.class.getInterfaces();
//		System.out.println(interfaceClass[0].getName());
		
//		通过class对象来获取该类中所有的方法的数组
//		Method [] stumet = Student.class.getDeclaredMethods();
////		System.out.println(stumet[0].getName()+"\t"+stumet[0].getAnnotations());
//		Method[] m1 = Student.class.getMethods();
//		for(Method m:m1){
//			System.out.println(m.getName()+"\t"+m.getReturnType()+"\t"+m.getParameters()[0].getType());
//		}
//		Class[] l=new Class[1];
//		l[0]= java.lang.Long.class;
//		try {
//			Method m1 = Student.class.getDeclaredMethod("sleep");
//			m1.getName();
//		} catch (NoSuchMethodException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (SecurityException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		获取当前类自己定义的属性,包括所有的权限修饰符
//		Field[] f1 = Student.class.getDeclaredFields();
//		for(Field f:f1){
//			System.out.println(f.getName()+"\t"+f.getType()+"\t"+f.getModifiers());
//		}
//		取得所有public的属性,包括继承的,接口中声明的和自己定义的
//		Field[] f2 = Student.class.getFields();
//		for(Field f:f2){
//			System.out.println(f.getName()+"\t"+f.getType()+"\t"+f.getModifiers());
//		}
//		使用class对象创建类的对象
//		Student stu=null;
//		Field namefie;
//		Field schoolfie;
//		Field agefie;
//		Field addressfie;
//		try {
//			Class c = Class.forName("com.hisoft.java.reflect.Student");
//			stu = (Student)c.newInstance();
//			
////			getField只能获取public修饰的属性
//			namefie = c.getField("name");
//			schoolfie = c.getField("school");
//			
//			schoolfie.setAccessible(false);
////			可以通过getDeclaredField方法获取私有的属性,如果是私有的也要通过setAccessible()方法,将访问级别设为true
//			agefie = c.getDeclaredField("age");
//			agefie.setAccessible(true);
//			addressfie=c.getDeclaredField("address");
////			setAccessible这个方法只是针对私有的属性
//			addressfie.setAccessible(false);
//			addressfie.set(stu, "河南郑州");
//			
//			agefie.set(stu, 18);
//			namefie.set(stu,"俊成");
//			schoolfie.set(stu, "郑大");
//			System.out.println(stu.getName());
//			System.out.println(stu.school);
//			System.out.println(stu.getAge());
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		Field[] f = getPrivateField("com.hisoft.java.reflect.Student","public");
//		for(Field f1:f){
//			System.out.println(f1.getName());
//		}
//		通过反射获取类中的指定方法
		
//		try {
//			Class c = Class.forName("com.hisoft.java.reflect.Student");
//			Student stu = (Student)c.newInstance();
////			返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定所有访问权限的成员方法
//			Method m = c.getDeclaredMethod("sleep", long.class);
////			返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法
//			
//			Method m1 = c.getDeclaredMethod("sleep", String.class,long.class);
////			m1.setAccessible(true);
//			System.out.println(m1.isAccessible());
//			System.out.println(m.getName());
//			System.out.println(m1.getName());
//			
//			m.invoke(stu, 12);
//			m1.invoke(stu, "tom",12);
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		try {
//			List list = getPrivateMethod("com.hisoft.java.reflect.Student");
//			for(Method m:list){
//				System.out.println(m.getName());
//			}
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		
//		通过反射获取该类的构造方法

		
//		try {
//			Class c = Class.forName("com.hisoft.java.reflect.Student");
//			Student stu = (Student)c.newInstance();
////			取得public的构造函数
//			Constructor[] con = c.getDeclaredConstructors();
//			for(Constructor cn:con){
//				System.out.println(cn.getName());
//			}
//			System.out.println();
//			Constructor c1 = c.getConstructor(String.class,int.class);
//			Student stu1 =(Student) c1.newInstance("tom",12);
//			System.out.println(stu1.getName()+"\t"+stu1.getAge());
//			Constructor c2 = c.getConstructor(String.class,int.class,String.class);
//			Student stu2 = (Student)c2.newInstance("jerry",15,"河南郑州");
//			System.out.println(stu2.getName()+"\t"+stu2.getAge()+"\t"+stu2.getAddress());
//			
//			Constructor c3 = c.getDeclaredConstructor(int.class,String.class);
//			c3.setAccessible(true);
//			Student stu3 = (Student)c3.newInstance(12,"男");
//			System.out.println(stu3.getAge()+"\t"+stu3.getSex());
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		
//		第三种实例化类的方法,通过类加载器.getSystemClassLoader().loadClass();
		
		try {
			Class c = ClassLoader.getSystemClassLoader().loadClass("com.hisoft.java.reflect.Student");
			Student stu = (Student) c.newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

	}
	
	public static List getPrivateMethod(String className) throws Exception{
		Class c = Class.forName(className);
		List methodList=new ArrayList<>();
		Method[] lm = c.getDeclaredMethods();
		for(int i=0;i







你可能感兴趣的:(java基础学习日志19)