实例讲解Java基础之反射

前期准备

编写一个真实类phone,实现list接口

public class Phone implements List {
  public double price;
  public String name;
  public Phone() {
  }
  public Phone(double price, String name) {
    this.price = price;
    this.name = name;
  }
  public double getPrice() {
    return price;
  }
  public void gege(String h){
    System.out.println("gege的"+h);
  }
  public void setPrice(double price) {
    this.price = price;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  @Override
  public String toString() {
    return "Phone{" +
        "price=" + price +
        ", name='" + name + '\'' +
        '}';
  }
  @Override
  public int size() {
    return 0;
  }
  @Override
  public boolean isEmpty() {
    return false;
  }
  @Override
  public boolean contains(Object o) {
    return false;
  }
  @Override
  public Iterator iterator() {
    return null;
  }
  @Override
  public Object[] toArray() {
    return new Object[0];
  }
  @Override
  public boolean add(Object o) {
    return false;
  }
  @Override
  public boolean remove(Object o) {
    return false;
  }
  @Override
  public boolean addAll(Collection c) {
    return false;
  }
  @Override
  public boolean addAll(int index, Collection c) {
    return false;
  }
  @Override
  public void clear() {
  }
  @Override
  public Object get(int index) {
    return null;
  }
  @Override
  public Object set(int index, Object element) {
    return null;
  }
  @Override
  public void add(int index, Object element) {
  }
  @Override
  public Object remove(int index) {
    return null;
  }
  @Override
  public int indexOf(Object o) {
    return 0;
  }
  @Override
  public int lastIndexOf(Object o) {
    return 0;
  }
  @Override
  public ListIterator listIterator() {
    return null;
  }
  @Override
  public ListIterator listIterator(int index) {
    return null;
  }
  @Override
  public List subList(int fromIndex, int toIndex) {
    return null;
  }
  @Override
  public boolean retainAll(Collection c) {
    return false;
  }
  @Override
  public boolean removeAll(Collection c) {
    return false;
  }
  @Override
  public boolean containsAll(Collection c) {
    return false;
  }
  @Override
  public Object[] toArray(Object[] a) {
    return new Object[0];
  }
}

1.反射之4种new对象

public class Test2 {
  public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
    //第一种
    Phone p = new Phone(2999,"小米");
    System.out.println(p);//Phone{price=2999.0, name='小米'}
    //第二种 需要一个空参构造
    Class<Phone> phoneClass = Phone.class;
    Phone phone = phoneClass.newInstance();
    phone.setName("华为");
    phone.setPrice(3499);
    System.out.println(phone);//Phone{price=3499.0, name='华为'}
    //第三种
    Class<?> aclass = Class.forName("com.demo.bean.Phone");
    Phone p2 = (Phone) aclass.newInstance();
    p2.setPrice(2999);
    p2.setName("魅族");
    System.out.println(p2);//Phone{price=2999.0, name='魅族'}
    //第四种,需要一个配置文件phone.properties
    String name = ResourceBundle.getBundle("phone").getString("myphone");
    Class<?> bClass = Class.forName(name);
    Phone p3 = (Phone) bClass.newInstance();
    p3.setPrice(3299);
    p3.setName("锤子");
    System.out.println(p3);//Phone{price=3299.0, name='锤子'}
  }
}

配置文件phone.properties

myphone=com.demo.bean.Phone

2. 反射之获取类、父类、实现接口

public class Test3 {
  public static void main(String[] args) throws ClassNotFoundException {
    String string = ResourceBundle.getBundle("phone").getString("myphone");
    Class<?> aClass = Class.forName(string);
    //获取类的完整路径
    System.out.println(aClass.getName());//com.demo.bean.Phone
    //获取类的简单名字
    System.out.println(aClass.getSimpleName());//Phone
    //获取类的父类
    Class<?> superclass = aClass.getSuperclass();
    System.out.println(superclass.getName());//java.lang.Object
    System.out.println(superclass.getSimpleName());//Object
    //获得类的接口
    Class<?>[] interfaces = aClass.getInterfaces();
    for (Class<?> in:interfaces
       ) {
      System.out.println(in.getSimpleName());
    }
  }
}

3.反射之获取空参、有参构造

public class Test4 {
  public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException {
    String string = ResourceBundle.getBundle("phone").getString("myphone");
    Class<?> aClass = Class.forName(string);
    //调用的是无参的构造方法
    Phone p1 = (Phone) aClass.newInstance();
    p1.setName("华为");
    p1.setPrice(2999);//Phone{price=2999.0, name='华为'}
    System.out.println(p1);
    //获得无参的构造方法
    Constructor<?> constructor = aClass.getConstructor();
    System.out.println(constructor);//public com.demo.bean.Phone()
    //获得所有的构造方法
    Constructor<?>[] constructors = aClass.getConstructors();
    for (Constructor<?> c:constructors
       ) {
      System.out.println(c);
    }
  }
}

4.反射之获取方法

public class Test5 {
  public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,InstantiationException,IllegalAccessException,InvocationTargetException{
    String string = ResourceBundle.getBundle("phone").getString("myphone");
    Class<?> aClass = Class.forName(string);
    //包含了父类的方法
    Method[] methods = aClass.getMethods();
    for (Method m:methods
       ) {
      System.out.println(m);
    }
    //本类中的方法,没有父类的方法
    Method[] declaredMethods = aClass.getDeclaredMethods();
    for (Method m:declaredMethods
       ) {
      System.out.println(m);
    }
    Method gege = aClass.getMethod("gege",String.class);
    //获取gege方法的权限修饰符
    System.out.println(Modifier.toString(gege.getModifiers()));
    //获取gege方法的返回值类型
    System.out.println(gege.getReturnType());
    //设置gege的参数值
    Object o = aClass.newInstance();
    gege.invoke(o,"aa");
  }
}

5.反射之获取字段

public class Test6 {
  public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
    String string = ResourceBundle.getBundle("phone").getString("myphone");
    Class<?> aClass = Class.forName(string);
    //只能调用public 字段,但是能得到父类的字段
    Field[] fields = aClass.getFields();
    for (Field f:fields
       ) {
      System.out.println(f.getName());
    }
    //只能调用public 字段,只能得到本类中的字段
    Field[] declaredFields = aClass.getDeclaredFields();
    for (Field f:declaredFields
       ) {
      System.out.println(f.getName());
    }
    //获取某一字段的数据类型
    Field name = aClass.getField("name");
    String simpleName = name.getType().getSimpleName();
    System.out.println(simpleName);
    name.setAccessible(true);
    Object o = aClass.newInstance();
    name.set(o,"华为");
    System.out.println(name.get(o));
  }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Java注解与反射原理说明

    一 点睛 注解若想发挥更大作用,还需借助反射机制之力.通过反射,可以取得一个方法上声明的注解的全部内容. 一般有两种需求: 1 取得方法中全部的注解,通过调用getAnnotations来实现. 2 判断操作是否是指定注解,通过调用getAnnotation来实现. 下面从源码角度来说明怎样获取这些注解信息. 二 源码导读--取得方法中全部的注解 public class AccessibleObject implements AnnotatedElement { ... //取得全部Annot

  • java反射机制Reflection详解

    Java语言有好些个名词,让人望而生畏. 上智不教即知,下愚虽教无益,中庸之人,不教不知. 人的天性中就有一点对未知的恐惧. 刚开始不了解,也没认真看,发现好难呀:等,静下心来自己研究,再看其实不难,发现都是纸老虎,不堪一击. 今天就来分析一下反射:Reflection 看一下维基百科的解释: 在诸如Java之类的面向对象的程序设计语言中,反射允许在程序运行期间访问 类.接口.字段和方法,而不必在编译期间知道接口.字段或者方法的名称. 反射也允许实例化对象和调用方法. 总结三点: 第一:反射可以

  • Java在利用反射条件下替换英文字母中的值

    Java在利用反射条件下替换英文字母中的值 (1)创建两个Class: ReflectTest类如下: package cn.itcast.day01; import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class ReflectTest { public static void main(String[] args) throws Exception { changeStringValue(

  • 详解提高使用Java反射的效率方法

    在我们平时的工作或者面试中,都会经常遇到"反射"这个知识点,通过"反射"我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是"反射"很慢,要少用.难道反射真的很慢?那跟我们平时正常创建对象调用方法比慢多少? 估计很多人都没去测试过,只是"道听途说".下面我们就直接通过一些测试用例来直观的感受一下"反射". 正文 准备测试对象 下面先定义一个测试的类Test

  • Java动态代理和反射机制详解

    反射机制 Java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法.属性和构造方法等. 动态代理:分为JDK动态代理.cglib动态代理(spring中的动态代理). 静态代理 预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理 动态代理 代理类在程序运行时创建的代理方式.也就是说,代理类并不是在Java代码中定义的,而是在运行期间根据我们在Java代码中的"指示"动态生成的. 动态代理比

  • Java对类私有变量的暴力反射技术讲解

    Java对类私有变量的暴力反射 假设有一个类,他有一个私有变量: package com.howlaa.day04; public class ReflectPoint { private int priVar; public ReflectPoint(int priVar){ this.priVar =priVar; } } 如果我们直接采用.get的方式,是不可能看到私有变量的. 我们可以这样: package com.howlaa.day04; import java.lang.refle

  • Java反射机制的讲解

    Java中的反射提供了一种运行期获取对象元信息的手段.即正常方法是通过一个类创建对象,反射方法就是通过一个对象找到一个类的信息. Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method; 其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象.通过这四个对象我们可以粗略的看到一个类的各个组成部分. Java反射的作用: 在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属

  • 实例讲解Java基础之反射

    前期准备 编写一个真实类phone,实现list接口 public class Phone implements List { public double price; public String name; public Phone() { } public Phone(double price, String name) { this.price = price; this.name = name; } public double getPrice() { return price; } p

  • Java基础之反射详解

    前言 反射是我们框架的灵魂,反射也是我们框架的一个底层基石,没有反射也就没有框架,如果我们学好了反射,对我们阅读框架底层是有很大班助的--阿俊.有些文章上来就讲反射,就会很懵逼,不知道是干啥的,所以我们就引出一些问题来看看为什么需要反射 一.一个需求引出反射 看下面的问题 根据配置文件reflection.properties指定信息,创建People对象并调用方法hi classullpath= com.reflection.People method=hi 思考:使用现有技术,能做吗? 我们

  • java基础之反射和泛型以及注解

     java基础之反射和泛型以及注解 泛型擦除 泛型擦除: 泛型只在编译时期有效,编译后的字节码文件中不存在泛型信息. 声明泛型集合,集合两端类型必须一致.类型也可以用包装类型,泛型的类型必须是引用类型,不能为基本类型. 实现公用的类和方法,对公用的业务进行抽取. 泛型方法/泛型类/泛型接口 public class GenericTest { /** * 泛型声明,定义泛型方法 * @param <T> * @param <K> * @param t * @param k */ p

  • 实例讲解JAVA 模板方法模式

    在讲述这个模式之前,我们先看一个案例:抄题目:两个学生将老师出的题目抄写在纸上,并且写出答案 先看一个比较笨的写法 public class TestPaperA { public void testQuestion1(){ System.out.println("1+1等于几? a.1 b.2 c.3 d.4"); System.out.println("答案:b"); } public void testQuestion2(){ System.out.print

  • 实例讲解JAVA 适配器模式

    在讲述这个模式之前,我们先看一个案例:中国球员去NBA打篮球 中国球员去NBA打篮球,可是他不懂英语,所以听不懂教练安排的战术,所以现在有三种解决方式 1.球员学会英语.2.教练学会中文.3.请个翻译. 1和2是长久之计,但不能解决迫在眉睫的问题.请个翻译是短暂的更好的选择. 放在软件设计层面上,这就叫做适配器模式.https://www.jb51.net/article/189484.htm 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以

  • 实例讲解JAVA设计模式之备忘录模式

    在讲述这个模式之前,我们先看一个案例:游戏回档 游戏的某个场景,一游戏角色有生命力.攻击力.防御力等数据,在打Boss前和后会不一样,我们允许玩家如果感觉与Boss决斗的效果不理想,可以让游戏恢复到决斗前.下面是代码: 游戏角色类,用来存储角色的生命力.攻击力.防御力的数据. public class GameRole { private int vit;//生命力 private int atk;//攻击力 private int def;//防御力 //状态显示 public void st

  • 实例讲解Java HashSet

    HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合. HashSet 允许有 null 值. HashSet 是无序的,即不会记录插入的顺序. HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的. 您必须在多线程访问时显式同步对 HashSet 的并发访问. HashSet 实现来 Set 接口. HashSet 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类. 基本类型对应的包装类表如下: 基本类型 引用类型

  • 实例讲解Java中的synchronized

    一.使用场景 在负责后台开发的时候,很多时候都是提供接口给前端开发人员去调用,会遇到这样的场景: 需要提供一个领奖接口,每个用户名只能领取一次,我们可以将成功领取的用户在数据库用个标记保存起来.如果这个用户再来领取的时候,查询数据库看该用户是否领取过. 但是问题来了,假设用户手速很快,极短时间内点了两次领奖按钮(前端没有进行控制,我们也不能依赖前端去控制).那么可能掉了两次领奖接口,而且有可能第二次调用的时候查询数据库的时候,第一次领奖还没有执行完成更新领奖标记. 这种场景就可以使用到synch

  • 实例讲解Java 自旋锁

    一直以来不是怎么清楚自旋锁,最近有点时间,好好的学习了一下: 所谓的自旋锁在我的理解就是多个线程在尝试获取锁的时候,其中一个线程获取锁之后,其他的线程都处在一直尝试获取锁的状态,不会阻塞!!!那么什么叫做一直尝试获取锁呢?就是一个循环,比较经典的是AtomicInteger中的一个updateAndGet方法,下图所示(当然也可以直接看unsafe类中的getAndAddInt等类似方法): 我们可以看出在while循环中使用CAS去尝试更新一个变量,如果更新失败,就会一直在这个循环中一直在尝试

  • Java基础之反射技术相关知识总结

    一.反射概念 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法.这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制.反射被视为动态语言的关键. 二.反射应用场景 1.几乎所有的框架都会用到反射 2.程序解耦合使用 3.代码更加的优雅 三.反射更多细节 1.Jdk中的位置: java.lang.reflect包下 2.获取字节码方式 //

随机推荐