反射机制

反射机制

什么是反射呢?我大概的理解就是让对象认识到自身的结构。
也就是可以在运行期间可以获得对象的类型、方法、属性等。

获取对象类型

1.Object.getClass()//返回对象的关键字、包名、类名

2.Class.forName(“包名.类名”)//返回对象的关键字、包名、类名

3.类名.class//返回对象的关键字、包名、类名
下面以Student类为例:

package org.xupt.blogs;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

输出结果;

package org.xupt.blogs;

public class Test {
    public static void main(String[] args) {
        //1.Object.getClass()//返回对象的关键字、包名、类名
        System.out.println(new Student().getClass());
        //2.Class.forName("包名.类名")//返回对象的关键字、包名、类名
        try {
            System.out.println(Class.forName("org.xupt.blogs.Student"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //3.类名.class//返回对象的关键字、包名、类名
        System.out.println(Student.class);
    }
}

这些类型信息在Java虚拟机中仍然表现为一个对象,而且只存在一份

类对象的功能

1.用反射方式创建对象

一般方式: new 类名();

反射方式:类对象.newInstance();//创建一个新的实例

要求:

1.对象必须拥有无参构造器
否则会出现异常。

2.构造方法不能私有

同样的以Student为例

package org.xupt.blogs;

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(student.toString());
        
        Student student1 = null;
        try {
            student1 = Student.class.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        System.out.println(student1.toString());

    }
}

2.获取方法信息

1.类对象.getMethods();//获取所有public方法,包括继承返回一个Method数组

2.类对象.getDeclareMethods();//获取本类中的所有方法,但不包括继承的方法

3.类对象.getMethod(“方法名”)//找公共方法,包括继承

4.类对象.getDeclareMethod(“方法名”)//找本类方法不包括继承

package org.xupt.blogs;

import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws NoSuchMethodException {
        //1.类对象.getMethods();//获取所有public方法,包括继承返回一个Method数组
        Method[] methods = Student.class.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("********************");
        //2.类对象.getDeclareMethods();//获取本类中的所有方法,但不包括继承的方法
        Method[] declaredMethods = Student.class.getDeclaredMethods();
        for (Method method : declaredMethods) {
            System.out.println(method);
        }
        System.out.println("********************");
        //3.类对象.getMethod("方法名")//找公共方法,包括继承
        Method equals = Student.class.getMethod("equals", Object.class);
        System.out.println(equals);
        System.out.println("********************");
        //4.类对象.getDeclareMethod("方法名")//找本类方法不包括继承
        Method setName = Student.class.getDeclaredMethod("setName", String.class);
        System.out.println(setName);

    }
}

3.获取属性信息

1.getFields();//获取公共属性,和继承的属性

2.getDeclaredFields();//获取所有属性

3.getField(“属性名”);//获取指定的公共属性和继承属性

4.getDeclaredField(“属性名”);//获取指定属性

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws NoSuchFieldException {
        Constructor<?>[] constructors = Student.class.getConstructors();
        System.out.println(constructors);
        Constructor<?>[] declaredConstructors = Student.class.getDeclaredConstructors();
        System.out.println(declaredConstructors);

    }
}

反射调用方法

1.正常方式:对象.方法(参数)

2.反射方式:方法.invoke(对象,参数)



import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class Test {
    public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Student student = new Student();
        Method getName = student.getClass().getMethod("getName");
        System.out.println(getName.invoke(student));

    }
}

缺点:
1.编程复杂度高

2.效率低

优点:
1.可以调用私有的方法,突破正常方法限制

2.经常在开源框架中使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值