反射
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