if (trim(r)!=""){if(Pos("成功",r)>0){mymsg("保存成功!")} else {myalert(r);} } [@@@@]
反射Field、Method、Constructor
2022-12-08 21:48:32
746
转载:kaotop.com/it/1077896.html
一些要用到的方法:getFields():获取public修饰的属性
getDeclaredFields():获取所有属性
getModifiers():获取修饰符(输出时要用Modifier.toString()包裹)
getType():获取属性的类型,返回Class类型,输出需要.getName()
getReturnType():获取方法的返回值类型
getName():获取完整类名
getSimpleName():获取简单类名称
getParameterTypes():获取参数列表的数据类型,返回值是个数组类型
一、反射Field (通过反射机制访问属性很重要)
Student.java
main:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | try {
Class studentClass = Class.forName( "com.example.test.Student" );
Object obj = studentClass.newInstance();
Field[] fields = studentClass.getFields();
System.out.println(fields.length);
Field[] fs = studentClass.getDeclaredFields();
System.out.println(fs.length);
for (Field field: fs) {
System.out.println(Modifier.toString(field.getModifiers())+ " " +field.getType().getSimpleName() + " " +field.getName());
}
Field noField = studentClass.getDeclaredField( "no" );
Field nameField = studentClass.getDeclaredField( "name" );
Field sexField = studentClass.getDeclaredField( "sex" );
Field ageField = studentClass.getDeclaredField( "age" );
noField.set(obj, 201883 );
nameField.setAccessible( true );
nameField.set(obj, "宇航员" );
sexField.set(obj, true );
ageField.set(obj, 21 );
System.out.println(noField.get(obj) + " " + nameField.get(obj) + " " + sexField.get(obj) + " " + ageField.get(obj));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
|
二、反射Method
Method.java:
main:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | try {
Class methodClass = Class.forName( "com.example.test.Method" );
Object m = methodClass.newInstance();
Method[] ms = methodClass.getDeclaredMethods(); //可获取到私有方法
System.out.println(ms.length);
for (Method method:ms) {
System.out.println(Modifier.toString(method.getModifiers()) + " " +
method.getReturnType().getSimpleName() + " " + method.getName() + "{n" +
method.getParameterTypes()); //parameter返回的是数组,通过for循环输出
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
|
三、反射机制调用方法(非常重要)
1 2 3 4 5 | Class class = Class.forName( "com.example.test.Method" );
Object obj = class .newInstance();
Method method = class .getDeclaredMethod( "m1" ,String. class ,String class );
Object retValue = method.invoke(obj, "admin" , "123" );
|
四、反射Constructor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public class Vip{
int no;
String name;
String birth;
boolean sex;
public Vip(){
}
public Vip( int no){
this .no = no;
}
public Vip( int no,String name){
this .no = no;
this .name = name;
}
public Vip( int no,Srting name,String birth){
this .no = no;
this .name = name;
this .birth = birth;
}
public Vip( int no,String name,String birth, boolean sex){
this .no = no;
this .name = name;
this .birth = birth;
this .sex = sex;
}
}
|
main:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //反编译一个类的构造方法
StringBuilder s = new StringBuilder();
Class vipClass = Class.forName( "com.syf.java.bean.Vip" );
s.append(Modifier.toString(vipClass.getModifiers()));
s.append( " class" );
s.append(vipClass.getSimpleName());
s.append( "{n" );
s.append( "}" );
System.out.println(s);
Constructor[] constructors = vipClass.getDeclaredConstructors();
for (Costructor construtor : constructors){
s.append( "t" );
s.append(Moifier.toString(constructor.getModifiers()));
s.append( " " );
s.append(vipClass.getSimpleName());
s.append( "(" );
Class[] parameterTypes = constructor.getParameterTypes();
for (Class parameterType : parameterTypes){
s.append(parameterType.getSimpleName());
s.append( "," );
}
//删除最后下标位置上的字符
if (parameterTypes.length ; 0 ){
s.deleteCharAt(s.length()- 1 );
}
s.append( "){}n" );
}
|
通过反射机制调用构造方法(非重点)
1 2 3 4 5 | Class c = Class.forName( "com.syf.java.bean.Vip" );
Object obj = c.newInstance();
Constructor con = c.getDeclaredConstructor( int . class ,String. class ,String. class , boolean . class );
Object newObj = con.newInstance( 110 , "jackson" , "2000-02-02" , true );
System.out.println(newObj); //要重写Vip的toString方法
|
五、获取类的父类和父接口(重点)
1 2 3 4 5 6 7 | Class stringClass = Class.forName( "java.lang.String" );
Class superClass = stringClass.getSuperClass();
System.out.println(superClass.getName());
Class[] interfaces = stringClass.getInterfaces();
for (Class in : interfaces){
System.out.println(in.getName());
}
|
*特别说明:本文来自网络,如有侵权,请联系我们删除,非常感谢!