package lucas;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Properties;
public class MainCla {
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException {
//第一种方式获取class对象,已经new出来了,还整个屁
Student stu = new Student();//new后产生两个对象,一个Student对象,一个Class对象
Class<? extends Student> stuC = stu.getClass();//获取class对象
System.out.println(stuC.getName()); //lucas.Student
//第二种方式获取class对象,需要导包
Class<Student> stuC2 = Student.class;
System.out.println(stuC == stuC2);
//第三种方式获取Class对象,Class类的静态方法
try {
Class<?> stuC3 = Class.forName("lucas.Student");注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
System.out.println(stuC == stuC3);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Constructor<?>[] conArray = stuC2.getConstructors();
for(Constructor c : conArray) {
System.out.println(c);
}
System.out.println("---------------------------------------------declared------------------------------------------");
Constructor<?>[] declaredCon = stuC2.getDeclaredConstructors();
for (Constructor c : declaredCon)
{
System.out.println(c);
}
System.out.println("---------------------------------------------获取无惨、共有------------------------------------------");
try {
Constructor<? extends Student> cons = stuC.getConstructor(null);
System.out.println(cons);
//调用构造方法
Student student = cons.newInstance();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("---------------------------------------------私有、有参的------------------------------------------");
try {
Constructor<? extends Student> declaredConstructor = stuC.getDeclaredConstructor(char.class);
System.out.println(declaredConstructor);
//暴力访问
declaredConstructor.setAccessible(true);
Student student = declaredConstructor.newInstance('男');
Constructor<? extends Student> dc = stuC.getDeclaredConstructor(int.class);
dc.setAccessible(true);
Student st = dc.newInstance(20);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
System.out.println("---------------------------------------------公共字段------------------------------------------");
Field[] fields = stuC.getFields();
for (Field f :
fields) {
System.out.println(f);
}
System.out.println("---------------------------------------------所有字段------------------------------------------");
Field[] fs = stuC.getDeclaredFields();
for (Field f :
fs) {
System.out.println(f);
}
System.out.println("---------------------------------------------私有name字段,并使用(赋值)------------------------------------------");
try {
Field name = stuC.getDeclaredField("name");
System.out.println(name);
name.setAccessible(true);
Student student = stuC.newInstance();
name.set(student, "lucas");
System.out.println(student.getName());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
System.out.println("---------------------------------------------所有公共的方法------------------------------------------");
Method[] methods = stuC.getMethods();
for (Method m :
methods) {
System.out.println(m);
}
System.out.println("---------------------------------------------所有的方法------------------------------------------");
Method[] declaredMethods = stuC.getDeclaredMethods();
for (Method m :
declaredMethods) {
System.out.println(m);
}
System.out.println("---------------------------------------------setName(),并唤醒------------------------------------------");
try {
Method setName = stuC.getMethod("setName", String.class);
Student student = stuC.newInstance();
setName.invoke(student,"lucas");
System.out.println(student.getName());
} catch (NoSuchMethodException e) {
}
System.out.println("---------------------------------------------Student类的main()------------------------------------------");
try {
Class<?> aClass = Class.forName("lucas.Student");
Method mainM = aClass.getMethod("main", String[].class);
Object o = aClass.newInstance();
mainM.invoke(o, (Object)new String[]{"a","b","c"});
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
System.out.println("---------------------------------------------读配置文件------------------------------------------");
try {
Method methodName = stuC.getMethod(getValue("methodName"));
int info = (int)methodName.invoke(stuC.getConstructor().newInstance());
System.out.println("..........info:" + info);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("---------------------------------------------通过反射越过泛型检查------------------------------------------");
ArrayList<String> al = new ArrayList<String>();
al.add("lucas");
al.add("hello" );
Class<? extends ArrayList> aClass = al.getClass();
try {
Method add = aClass.getMethod("add", Object.class);
add.invoke( al,100);
for (Object obj :
al) {
System.out.println(obj);
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
public static String getValue(String key) throws IOException {
Properties properties = new Properties();
FileReader in = new FileReader("c:/users/S/desktop/pro.txt");
properties.load(in);
in.close();
return properties.getProperty(key);
}
}