1.通过类类型获取类的方法信息和类的属性信息
public class FanShe {
//获取类的方法信息
public static void print(Object object){
Class c1=object.getClass();
//获取该类所有的方法
Method[] methods=c1.getMethods();
for(int i=0;i<methods.length;i++){
//每个方法的返回值类类型
Class returnType=methods[i].getReturnType();
System.out.println(returnType.getName()+"");
//方法名称:
System.out.println(methods[i].getName());
//获取参数类型
Class[] par=methods[i].getParameterTypes();
for(Class c:par){
System.out.print(c.getName()+",");
}
}
}
//获取类的成员变量属性何信息
public static void bianliang(Object object){
Class c1=object.getClass();
Field[] fields= c1.getDeclaredFields();
for(Field field:fields){
Class fieldType=field.getType();
//获取成员变量的类型
String typename=fieldType.getTypeName();
//获取成员变量的名称
String fieldName=field.getName();
System.out.println(typename+" "+fieldName);
}
}
public static void main(String arg[]){
String s="hello";
// print(s);
bianliang(s);
}
}
java方法反射的基本操作
public class Method {
public static void main(String args[]) throws InvocationTargetException, IllegalAccessException {
A a=new A();
Class c=a.getClass();
try {
java.lang.reflect.Method method=c.getMethod("print",int.class,int.class);
method.invoke(a,10,20);
java.lang.reflect.Method method1=c.getMethod("print",String.class,String.class);
method1.invoke(a,"1","2");
java.lang.reflect.Method method2=c.getMethod("print");
method2.invoke(a);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
class A{
public void print(int a,int b){
System.out.println("test+:"+(a+b));
}
public void print(String a,String b){
System.out.println(a+b);
}
public void print(){
System.out.println("hello");
}
}
运行结果:
test+:30
12
hello
泛型集合的本质:
public class List {
public static void main(String args[]) throws InvocationTargetException, IllegalAccessException {
ArrayList arrayList=new ArrayList();
ArrayList<String> list=new ArrayList<>();
Class c1=arrayList.getClass();
Class c2=list.getClass();
//list.add(2)错误
//结果为true编译之后的结果是去泛型化的
//java中的泛型防止错误输入,只在编译阶段有效
System.out.println(c1==c2);
//绕过编译 list集合本来只能加入String类型,现在使用反射加入int类型的数据
try {
Method m =c2.getMethod("add",Object.class);
m.invoke(list,20);
System.out.println(list.size());
System.out.println(list);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}