Java 学也学不明白之反射机制。

通过Class的newInstance方法,完成对象的创建,newInstance方法会调用User类的无参构造方法,无参构造必须存在!如果没有这个无参数构造方法会出现"实例化"异常。

示例代码(1):

User类:


public class User {

    public User() {

        System.out.println("无参数构造方法");

    }

}



测试类:


import ben.User;



public class ReflectText02 {

    public static void main(String[] args) {

        //不使用反射机制

        User user = new User();

        System.out.println(user);

        

        //反射机制创建对象

        try {

            //通过反射机制获取Class,通过Class实例化对象

            Class c = Class.forName("ben.User");//c代表User类型

            //newInstance方法会调用User类的无参构造方法,完成对象的创建

           

            Object obj = c.newInstance();

            System.out.println(obj);

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (IllegalAccessException e) {

            e.printStackTrace();

        } catch (InstantiationException e) {

            e.printStackTrace();

        }

    }

}





运行结果:


无参数构造方法

ben.User@10f87f48

无参数构造方法

ben.User@b4c966a



反射机制灵活性:可以做到不同对象的实例化,

资源绑定器:

java.util包下提供了一个资源绑定器,便于获取属性配置文件的内容,使用此方法时,属性文件必须在类路径下并且属性配置文件必须以.properties结尾。

示例代码:(2):


import java.util.ResourceBundle;



public class ResourceBundleText {

    public static void main(String[] args) {

        ResourceBundle bundle=ResourceBundle.getBundle("classinfo2");

        String className=bundle.getString("className");

        System.out.println(className);

    }

}



属性配置文件内容:

在这里插入图片描述

运行结果:


ben.User



三、Field类详解

=======================================================================

Field类常用方法:

(1)类<?> getDeclaringClass() 返回表示的类或接口声明的 Field对象表示的领域 类对象。

(2)int getModifiers() 返回的 Field对象表示的场java语言修饰符为整数。

(3)String getName() 返回的 Field对象表示的字段的名称。

(4)类<?> getType() 返回一个 类对象标识声明类型的 Field对象表示的场。

(5)String toString() 返回一个描述这个 Field字符串。

反射Student类中的Field属性

示例代码(3):

Student类:


public class Student {

    //Field:字段

    public int id ;

    private String name;

    protected int age;

    boolean sex;

    public static final double MATH_PI=301415926;

}





测试类:


import java.lang.reflect.Field;

import java.lang.reflect.Modifier;



public class ReflectText05 {

    public static void main(String[] args) {

        try {

            Class studenClass=Class.forName("ben.Student");



            String className=studenClass.getName();

            System.out.println("完整类型:"+className);

            String simpleName=studenClass.getSimpleName();

            System.out.println("简单类名:"+simpleName);

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

           

            //获取类中的Filed

            Field[] fileds=studenClass.getFields();

            System.out.println(fileds.length);//1

           

            //取出这个Field

            Field f=fileds[0];

            String fieldName=f.getName();

            System.out.println(fieldName);

            

            //取出所有的Field

            Field[] fs=studenClass.getDeclaredFields();

            System.out.println(fs.length);//4

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

           

            for (Field field: fs){

                //获取属性的修饰符列表

                int i=field.getModifiers();

                System.out.println(i);



                String modfiersString= Modifier.toString(i);

                System.out.println(modfiersString);

              

                //获取属性的类型

                Class fieldType=field.getType();

                //String fNum=fieldType.getName();

                String fNum=fieldType.getSimpleName();

                System.out.println(fNum);

              

                //获取属性名字

                System.out.println(field.getName());

               // System.out.println(field);

            }

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }





运行结果:


完整类型:ben.Student

简单类名:Student

==============================

2

id

5

=========================

1

public

int

id

2

private

String

name

4

protected

int

age

0



boolean

sex

25

public static final

double

MATH_PI



反射机制进行反编译Student类 !!

示例代码(4):


import ben.Student;



import java.io.File;

import java.lang.reflect.Field;

import java.lang.reflect.Modifier;

/*

反射机制进行反编译!!

 */

public class ReflectText06 {

    public static void main(String[] args) {

        try {

            StringBuilder s=new StringBuilder();



            Class studentClass=Class.forName("ben.Student");

           // Class studentClass=Class.forName("java.util.Date");

            s.append(Modifier.toString(studentClass.getModifiers())+"\t"+"class"+"\t"+studentClass.getSimpleName()+"{\n");

            Field[] fields=studentClass.getDeclaredFields();

            for (Field field:fields){

                s.append("\t");

                s.append(Modifier.toString(field.getModifiers()));

                s.append(" ");

                s.append(field.getType().getSimpleName());

                s.append(" ");

                s.append(field.getName());

                s.append(":\n");

            }

                s.append("}");

            System.out.println(s);



        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

}





运行结果:


public	class	Student{

	public int id:

	private String name:

	protected int age:

	 boolean sex:

	public static final double MATH_PI:

}



四、通过反射机制访问java对象的属性

================================================================================

给属性复制:set获取属性的值:get

示例代码(5):

Student类:


public class Student {

    //Field:字段

    public int id ;

    private String name;

    protected int age;

    boolean sex;

    public static final double MATH_PI=301415926;

}





测试类:


import java.lang.reflect.Field;



public class ReflectText07 {

    public static void main(String[] args) {

        try {

            Class studentClass=Class.forName("ben.Student");

            Object obj=studentClass.newInstance();//obj就是Student对象。(无参构造)

            //获取no属性(根据属性的名称获取Field)

            Field noField=studentClass.getDeclaredField("id");

            //给obj对象的no属性赋值

            noField.set(obj,2222 );//给no属性赋值2222

            //读取值

            System.out.println( noField.get(obj));



            Field nameFiled=studentClass.getDeclaredField("name");

            //打破封装,反射机制缺点

            nameFiled.setAccessible(true);

            //赋值

            nameFiled.set(obj,"jack");

            //获取

            System.out.println(nameFiled.get(obj));

            

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (IllegalAccessException e) {

            e.printStackTrace();

        } catch (InstantiationException e) {

            e.printStackTrace();

        } catch (NoSuchFieldException e) {

            e.printStackTrace();

        }

    }

}



# 最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

**目录:**

![全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)](https://img-blog.csdnimg.cn/img_convert/11d51236eb1e484eff6074a84b6f4cd8.webp?x-oss-process=image/format,png)

Java面试核心知识点

**一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**

![全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)](https://img-blog.csdnimg.cn/img_convert/647ef0e169cc70f5afbe6ba11330c242.webp?x-oss-process=image/format,png)

Java面试核心知识点

**已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了**

![全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)](https://img-blog.csdnimg.cn/img_convert/c2a7626297cc3fa341353ecb92eb6142.webp?x-oss-process=image/format,png)



eption e) {

            e.printStackTrace();

        } catch (IllegalAccessException e) {

            e.printStackTrace();

        } catch (InstantiationException e) {

            e.printStackTrace();

        } catch (NoSuchFieldException e) {

            e.printStackTrace();

        }

    }

}



# 最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

**目录:**

[外链图片转存中...(img-hVVxa4IT-1714313213600)]

Java面试核心知识点

**一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**

[外链图片转存中...(img-d3jUyt9E-1714313213601)]

Java面试核心知识点

**已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了**

[外链图片转存中...(img-WVoUBXCN-1714313213601)]



> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值