测试类一
public class Stu {
public String name ;
protected String sex;
private int age;
public static String school ="hqyj";
public static final String address="科华北路99号";
public void study(String subject) {
System.out.println("正在学习"+subject);
}
protected int add(int a,int b) {
return a+b;
}
public void add(String a,String b) {
System.out.println(a+b);
}
private void sleep(String friend) {
System.out.println("想和"+friend+"睡觉");
}
public void eat() {
System.out.println("今天中午吃什么");
}
public Stu() {
super();
}
public Stu(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "Stu [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static String getSchool() {
return school;
}
public static void setSchool(String school) {
Stu.school = school;
}
public static String getAddress() {
return address;
}
}
## 测试类二
public class Stu2 extends Stu{
}
## 反射的学习
package com.fs.testReflectDemo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
import com.fs.po.Stu;
public class TestReflectDemo {
public static void main(String [] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException, NoSuch
MethodException, IllegalArgumentException, InvocationTargetException {
Class<Stu> stuClass = getStuClass();
showFields(stuClass);
showStuConstrcutor(stuClass);
}
/* * 第一部分、获得类类型 * */
public static Class<Stu> getStuClass() throws ClassNotFoundException{
Class<Stu> stuClass1 = Stu.class;
Stu stu = new Stu();
Class<Stu> stuClass2 = (Class<Stu>) stu.getClass();
Class<Stu> stuClass3 =(Class<Stu>) Class.forName("com.fs.po.Stu");
return stuClass1;
}
/* * 第二部分、获得成员变量、通过反射给成员变量赋值 * */
public static void showFields(Class<? extends Stu> StuClass) throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {
Field [] myFields =StuClass.getDeclaredFields();
showFieldInfo( myFields);
Field [] myFields2 =StuClass.getFields();
showFieldInfo( myFields2);
Field name = StuClass.getDeclaredField("name");
Field age = StuClass.getDeclaredField("age");
Stu stu = StuClass.newInstance();
name.set(stu, "刘老师");
age.setAccessible(true);
age.set(stu, 33);
System.out.println(stu);
}
private static void showFieldInfo(Field[] fields) {
for (Field field : fields) {
int modefiers = field.getModifiers();
String type = field.getType().toString();
String name = field.getName();
System.out.println("修饰符"+modefiers + " 类型 " + type + " 名称 " + name);
}
System.out.println("-----------------------------------------");
}
/第三部分 构造法方法的获取,参数的传递/
public static void showStuConstrcutor(Class<Stu> stuClass) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Constructor<Stu>[] constructors1 = (Constructor<Stu>[]) stuClass.getDeclaredConstructors();
Constructor<Stu>[] constructors2 = (Constructor<Stu>[]) stuClass.getConstructors();
for (Constructor<Stu> constructor : constructors1) {
int modifiers = constructor.getModifiers();
String name = constructor.getName();
Parameter[] parameters = constructor.getParameters();
StringBuilder sb = new StringBuilder(modifiers+" "+ name+"(");
for (Parameter parameter : parameters) {
String type = parameter.getType().toString();
String pName = parameter.getName();
sb.append(type +" " + pName+ ", ");
}
int end = sb.lastIndexOf(", ");
if(end!=-1) {
sb = new StringBuilder(sb.substring(0, end));
}
sb.append(")");
System.out.println(sb);
}
Constructor<Stu> constructor = stuClass.getDeclaredConstructor();
Constructor<Stu> constructor2 = stuClass.getDeclaredConstructor(String.class, String.class, int.class);
Stu stu = constructor.newInstance();
Stu stu2 = constructor2.newInstance("魏鸿麒", "男", 18);
System.out.println(stu);
System.out.println(stu2);
}
}
练习:通过反射绕过泛型检测
private static void listDemo() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
List<String> strList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();
strList.add("Hello");
Class<List<String>> strListClass = (Class<List<String>>) strList.getClass();
Class<List<Integer>> intListClass = (Class<List<Integer>>) intList.getClass();
System.out.println(strListClass.equals(intListClass));
Method add = strListClass.getDeclaredMethod("add", Object.class);
add.invoke(strList, "world");
add.invoke(strList, 2);
add.invoke(strList, new Stu());
System.out.println(strList);
}