详述Java反射

反射是一种新的操作类中属性、构造方法和普通方法的机制
创建一个Student类

package venus;

public class Student {

    public static String name;

    public Student(){

    }

    private Student(String name){
     this.name = name;
    }

    public static int doHomework() {
        System.out.println(name+"正在做作业");
        return 1;
    }
}

获取Class对象

1、构造方法,Class.forName()

Class clazz = null;
try {
         clazz = Class.forName("venus.Student");
         System.out.println(clazz.getName());
     }catch (ClassNotFoundException e){
         e.printStackTrace();
     }

输出对象名venus.Student。
2、构造方法,类名.class

 clazz = Student.class;
 System.out.println(clazz.getName());

输出对象名venus.Student。
3、构造方法,对象.getClass()

clazz = new Student().getClass();
System.out.println(clazz.getName());

输出对象名venus.Student。
4、基本数据类型对应的class对象:包装类.TYPE

 clazz = Integer.TYPE;
 System.out.println(clazz.getName());

输出int。
5、数组类型对应class:元素类型[].class

clazz = String[].class;
System.out.println(clazz.getName());

输出[Ljava.lang.String;
6、某个类父类所对应的class对象

 clazz = Student.class.getSuperclass();
 System.out.println(clazz.getName());

输出Student的父类java.lang.Object
7、获取某个类对应的Class对象
分为只能是public方法和不区分访问权限方法两种情况

clazz = Student.class;
//public方法
try{
    Constructor constructor = clazz.getConstructor();
    System.out.println(constructor.getName());
}catch (Exception e){
    e.printStackTrace();
}
//不区分访问权限
try{
    Constructor constructor = clazz.getDeclaredConstructor(String.class);
    System.out.println(constructor.getName());
}catch (Exception e){
    e.printStackTrace();
}

获取构造方法

1、获取构造方法信息

Constructor constructor = clazz.getDeclaredConstructor(String.class);
clazz = constructor.getDeclaringClass();//获取是哪个类中的构造方法
System.out.println(clazz.getName());
int mod = constructor.getModifiers();
String result = Modifier.toString(mod);//获取方法访问权限
System.out.println(result);
System.out.println(constructor.getName());//获取构造方法名
Class [] clazzs = constructor.getParameterTypes();//获取参数列表
for (Class zz: clazzs) {
    System.out.println(zz.getName());
}

输出:
venus.Student
private
venus.Student
java.lang.String
2、使用构造方法

constructor.setAccessible(true);//若构造方法为非public先设置可访问
Object object = constructor.newInstance("Tom");
Student stu = (Student)object;
stu.doHomework();

即可输出Tom正在做作业。
如何操作类属性
1、如何获取
a.public方法,不仅包含本类的方法,还包括继承自父类的public方法
获取方法数组:

Method [] methods = clazz.getMethods();
for (Method method: methods) {
    System.out.println(method.getName());
}

输出:
doHomework
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
不仅包括本类中定义的doHomework方法,还包括其父类中equals等方法。
获取某个方法:

try {
    Method method = clazz.getMethod("doHomework");//只能获取public方法
    System.out.println(method);
}catch (Exception e){
    e.printStackTrace();
}

输出:
public static int venus.Student.doHomework()。
b、本类中声明的方法,不包含父类

Method [] methodss = clazz.getDeclaredMethods();
for (Method method: methodss) {
    System.out.println(method.getName());
}

只输出doHomework。
2、获取信息

Method method = clazz.getMethod("doHomework");//只能获取public方法  getMethod(name,Parameters)
System.out.println(method.getDeclaringClass());//获取在哪个类中声明
System.out.println(Modifier.toString(method.getModifiers()));//获取修饰符
System.out.println(method.getReturnType().getName());//获取返回值类型
System.out.println(method.getName());//获取方法名
Class [] clazzs = method.getParameterTypes();//获取参数列表

3、如何使用
反射中方法不区分静态与非静态

method.setAccessible(true);//若为非public先设置可访问
Object object = method.invoke(new Student());
System.out.println(object);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值