JAVA反射-(一)快速了解反射的一些作用

本文最后更新于:April 14, 2022 pm

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。

目录

快速了解反射的一些作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
class User{
private String username;
private String password;
private Integer age;
public void setS(){
System.out.println("setS方法执行了");
}
public void show(){
System.out.println("show方法执行了");
}
}

Class获取的方式

1
2
3
4
5
Class cs = Class.forName("com.annotationStu.User"); //第一种
Class cs = User.class; //第二种

User u = new User(); //第三种
Class cs = u.getClass();

获取包名

1
2
3
4
5
6
7
8
9
public class AnnoTest01 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
Class cs = Class.forName("com.annotationStu.User");

System.out.println(cs.getPackage().getName());

}
}

获取类名

1
2
3
4
5
6
7
8
9
public class AnnoTest01 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
Class cs = Class.forName("com.annotationStu.User");

System.out.println(cs.getSimpleName());

}
}

获取类的全限定名称

1
2
3
4
5
6
7
8
9
public class AnnoTest01 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
Class cs = Class.forName("com.annotationStu.User");

System.out.println(cs.getName());

}
}

获取对象示例

1
2
3
4
5
6
7
8
9
10
11
12
public class AnnoTest01 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
Class cs = Class.forName("com.annotationStu.User");

Object o = cs.newInstance(); //有些jdk提示已过期
Object o1 = cs.getConstructor().newInstance();
System.out.println(o);
System.out.println(o1);

}
}

获取类属性名称

获取指定属性值

1
2
3
4
5
6
7
8
9
10
public class AnnoTest01 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
Class cs = Class.forName("com.annotationStu.User");

Field password = cs.getField("nu"); //nu必须是public的,不能是private
System.out.println(password.get(cs.getConstructor().newInstance())); //值

}
}

获取类全部属性名称

1
2
3
4
5
6
7
8
9
10
11
public class AnnoTest01 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
Class cs = Class.forName("com.annotationStu.User");
Field[] declaredFields = cs.getDeclaredFields(); //获取类所有属性
for(Field it : declaredFields){
System.out.println(it.getName()); //打印属性名称
}

}
}

获取类中所有可用方法

1
2
3
4
5
6
7
8
9
10
11
public class AnnoTest01 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
Class cs = Class.forName("com.annotationStu.User");
Method[] declaredMethods = cs.getDeclaredMethods(); //获取所有的方法,包括setter、getter等
for(Method it: declaredMethods){
System.out.println(it.getName());
}

}
}

通过方法名称执行方法

这里是通过反射实现,好处在于方法名称可动态设置。

1
2
3
4
5
6
7
8
9
10
public class AnnoTest01 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
Class cs = Class.forName("com.annotationStu.User");
Object o = cs.newInstance();
Method show = cs.getMethod("show"); //通过方法名称找到方法,这里可以动态获取
show.invoke(o); //执行

}
}

给属性设值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AnnoTest01 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
Class cs = Class.forName("com.annotationStu.User");

Field password = cs.getField("nu"); //获取属性nu
Object o = cs.getConstructor().newInstance(); //获取对象实例

System.out.println(password.get(o)); //123
password.set(o,"www"); //给对象的password设新值
System.out.println(password.get(o)); //www

}
}