文章目录
前言
在反射机制中,由于我们不知道类里面的构造方法、自定义方法和属性有些什么,还有各种参数返回值和和修饰方法我们都不知道。所以我们就要获取里面的构造方法、自定义方法和属性等需要知道的内容
1、Java类的属性方法如下
package lesson20210629;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Student {
private String name;
public int age;
public static double height;
private Date birthday;
/**
* 构造方法
*/
public Student() {//无参构造方法
System.out.println("这里是无参构造方法");
}
public Student(String name){//有参构造方法
System.out.println("名称为"+name);
}
public Student(String name,int age){//不同参数构造方法
System.out.println("名称为"+name+",年龄为:"+age);
}
private Student(int age){//私有属性构造方法
System.out.println("私有年龄为"+age);
}
/**
* 自定义方法
*/
public void showMsg(){//无参无返回方法
System.out.println("无参无返回方法");
}
public void setName(String name){//有参无返回方法
System.out.println("有参,值为:"+name);
}
public String getName(){//无参有返回方法
System.out.println("带返回值的方法");
return "qn";
}
private void youName(){//私有无参无返回方法
System.out.println("私有你的名字");
}
//特殊参数
public void setBirthday(Date birthday){
System.out.println("你的生日:"+new SimpleDateFormat("yyyy-mm-dd").format(birthday));
}
//参数是数组
public void addStuName(String []names){
int i = 0;
for (String name:names) {
System.out.println(name+(i++==names.length-1?"":","));
}
}
}
2、java反射机制查看方法或属性
主函数
public class Test05 {
public static void main(String[] args) {
method01("lesson20210629.Student");
method02("lesson20210629.Student");
method03("lesson20210629.Student");
}
2.1.1、查看不同权限修饰符下的构造方法(访问该类的构造方法,不会访问默认继承的Object父类的构造方法)
public static void method01(String addr){
try {
Class clazz = Class.forName(addr);
//获取字节码中的公有化构造函数
Constructor[] cs = clazz.getConstructors();
for (Constructor c:cs) {
System.out.println(c);
}
//获取所有的类型的构造方法
Constructor csAll[] = clazz.getDeclaredConstructors();
for (Constructor c:csAll) {
System.out.println(c);
}
}catch (Exception e){
e.printStackTrace();
}
}
2.1.2、运行结果
2.2.1、查看不同权限修饰符下有无返回值的方法(可以访问默认继承Object父类的所有公有权限方法,也可以不访问)
public static void method02(String addr){
try {
Class clazz = Class.forName(addr);
System.out.println("........公有化方法(含默认继承父类Object公有方法)........");
Method ms[] = clazz.getMethods();
for (Method m:ms) {
System.out.println(m);
}
System.out.println("........所有方法不含默认继承的Object方法.........");
Method msAll[] = clazz.getDeclaredMethods();
for (Method m:msAll) {
System.out.println(m);
}
}catch (Exception e){
e.printStackTrace();
}
}
2.2.2、运行结果
2.3.1、查看不同权限修饰符下的属性(不访问默认继承Object父类的属性)
public static void method03(String addr){
try {
Class clazz = Class.forName(addr);
System.out.println(".........公有化属性........");
Field fs[] = clazz.getFields();
for (Field f:fs
) {
System.out.println(f);
}
System.out.println(".........所有属性........");
Field fsAll[] = clazz.getDeclaredFields();
for (Field f:fsAll
) {
System.out.println(f);
}
}catch (Exception e){
e.printStackTrace();
}
2.3.2、运行结果
总结
对于反射机制,我们可以先获取类里面对应的方法或属性,然后再对方法属性进行赋值和调用