栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java反射感悟

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java反射感悟

首先,何谓反射,为什么要用反射?

Class.forName()

那么你先要知道Class类,你可以理解为他是管理所有类的一个类:这也就是为什么Class.forName("类全路径") 可以得到类对象了;那么我们为什么要得到类对象呢?,因为他可以找到对应类并且加载;

我们来说一说何谓加载:当你java源文件通过编译器得到.class文件时,类加载器可以通过加载将其加载到内存当中,并将其中的静态数据放在方法区中(变为运行中的数据结构)然后产生Class对象;

与new的对比:

 其实到这里还是没有理解为何要反射:因为可以用new对吧,但是new的话,耦合会比较高(其实我也没明白为什么new耦合就高了),那么反射就是在程序在执行的时候获取其他类信息,简而言之就和spring的Autowired差不多,注入就完了;

那么反射到底作用是啥呢?

在Java运行环境中,对于任意一个类可以知道这个类的属性以及方法,对于任意一个对象可以调用任意一个方法,动态的获取类的信息以及动态的调用方法——反射机制

那么问题来了,是?描述的

Class类,我们通过反射为的就是从Class类中获取其他类信息

package com.huang.reflection;

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


public class test05 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class aClass = Class.forName("com.huang.reflection.User");
        User user = (User) aClass.newInstance();
        System.out.println(user);

        System.out.println("------------------");
        //含参构造
        Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class);
        User user2 = (User) declaredConstructor.newInstance("Fairy");//利用newInstance()给含参构造器赋值
        System.out.println(user2);

        System.out.println("-------------------");

        //通过反射调用普通方法
        User user3 = (User) aClass.newInstance();//其实可以理解为:通过类对象获取无参构造器
        //通过反射获取一个方法(setName())
        Method setName = aClass.getDeclaredMethod("setName", String.class);
        //将反射中的方法参数赋值(“激活”)
        setName.invoke(user3,"Fairy同学");
        //激活后getName()即可
        System.out.println(user3.getName());

        System.out.println("--------------------");
        //通过反射对属性进行操作
        User user4 = (User) aClass.newInstance();//首先得到类对象的无参构造
        //然后获取属性(类对象对类中内容具有一切执行操作权)
        Field name = aClass.getDeclaredField("name");

        //因为name是private,所以需要更改权限
        name.setAccessible(true);
        //对属性赋值操作
        name.set(user4,"Fairy同学2");
        System.out.println(user4.getName());
    }
}
这里简单概述一下反射的一些方法:

newIntance:通过Class对象调用,得到对应类中的无参构造;

当然有参构造也是可以的:1.首先得到Class对象,2.通过Class对象调用得到含参的构造器

3.然后构造器调用newInstance(),给构造器赋值;

Invoke:一般是用于给反射方法参数赋值的 :方法名.invoke(对象,参数值); 

通过类对象调用getDeclaredMethod("方法名",String.class(类型而已)) 得到反射方法;

setAccessible:变量属性为private时,需要修改权限

 //通过反射对属性进行操作
        User user4 = (User) aClass.newInstance();//首先得到类对象的无参构造
        //然后获取属性(类对象对类中内容具有一切执行操作权)
        Field name = aClass.getDeclaredField("name");

        //因为name是private,所以需要更改权限
        name.setAccessible(true);
        //对属性赋值操作
        name.set(user4,"Fairy同学2");
        System.out.println(user4.getName());

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691227.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号