IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java 学习小记 ---- 反射 -> 正文阅读

[Java知识库]Java 学习小记 ---- 反射

反射是通过.class文件获取一个类的信息
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

package edu.uestc.LearnningTest.Reflect;

import lombok.Data;

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

@Data
class  Stu{
    public   String  address ;
    private  String name;
    private  int age;
    public Stu(){

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

    public static void main(String[] args) {
        System.out.println("hello");
    }


}

public class Learining1 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException, NoSuchFieldException, InstantiationException {
        /**
         * 第一种反射方法 obj.getClass()
         */
        Stu stu1 = new Stu("zs",10);
        Class one =stu1.getClass();
        System.out.println(one.getSimpleName());
        /**
         * 第二种反射方法obj.class
         */
        Class two = Stu.class;
        System.out.println(one == two);
        /**
         * 第三种反射方法obj.forname() 【推荐】
         */
        Class three = Class.forName("edu.uestc.LearnningTest.Reflect.Stu");
        System.out.println(one == three);
        /**
         * 获得所有的声明的字段包括共有,私有,保护字段
         */
        Field[]  AllField  ;
        AllField = three.getDeclaredFields();
        for(Field s : AllField){
            System.out.println(s.getName());
        }
        /**
         * 获得声明的公有变量
         */
        Field[] PrivateField;
        PrivateField = three.getFields();
        for(Field s : PrivateField)
            System.out.println(s.getName());
        /**
         * 获得共有字段并调用
         */
        Field f  = three.getField("address");
        try{
            //获得一个对象
            //1 通过无参构造方法获取对象
            Object ob = three.getConstructor().newInstance();
            //在这个对象设置字段
            f.set(ob,"10086");
            //得到字段的值
            Stu three1 = (Stu) ob;
            System.out.println(three1.getAddress());
/**
            //2 通过有参构造方法获取对象
            Object ob1 = three.getConstructor(String[].class,int[].class).newInstance("qqa","12345");
            Stu three2 = (Stu) ob1;
            System.out.println(three2.getName()+three2.getAddress()+three2.getAge());
 **/
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        /**
         * 获得私有变量并调用
         */
        Field f1 = three.getDeclaredField("name");
        try{
            //获得一个对象
            Object obj = three.getConstructor().newInstance();
            f1.setAccessible(true); //解除私有限制
            f1.set(obj,"w5");
            //验证
            Stu three2 = (Stu) obj;
            System.out.println(three2.getName());
        } catch (InstantiationException e) {
            e.printStackTrace();
        }

        /**
         * 获取所有方法
         */
        Method[] m = three.getMethods();
        for(Method m1 : m){
            System.out.println(m1);
        }
        System.out.println("****************************");
        /**
         * 获取私有变量方法
         */
        Method[] m1 = three.getDeclaredMethods();
        for(Method m2 : m1){
            System.out.println(m2);
        }

        /**
         * 获取单个方法
         */
        Method m2 = three.getMethod("getAge",null);
        Method m3 = three.getDeclaredMethod("setName",String.class);

        //获得对象
        try{
            //实例化一个对象
            Object obj = three.getConstructor().newInstance();
            //实例化获得方法
            m2.invoke(obj,null);
            m3.invoke(obj,"qiuqian");
            Stu obj2 = (Stu)obj;
            System.out.println(obj2.getName());

        } catch (InstantiationException e) {
            e.printStackTrace();
        }

        /**
         * 反射main方法
         */

        Method mainMethod = three.getMethod("main",String[].class);
        Object obj3 = three.getConstructor().newInstance();
        Stu obj4 = (Stu)obj3;
        mainMethod.invoke(obj4,(Object) new String[]{"a","b","c"});
        //mainMethod.invoke(null,(Object) new String[]{"a","b","c"});




    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:04:04  更:2022-04-06 16:07:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:00:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码