Java反射重要吗?

System.out.println(

"(默认)的构造方法 s = " + str);

}

//无参构造方法

public Student(){

System.out.println(

“调用了公有、无参构造方法执行了。。。”);

}

//有一个参数的构造方法

public Student(char name){

System.out.println(

“姓名:” + name);

}

//有多个参数的构造方法

public Student(String name ,int age){

System.out.println(

“姓名:”+name+

“年龄:”+ age);

//这的执行效率有问题,以后解决。

}

//受保护的构造方法

protected Student(boolean n){

System.out.println(

"受保护的构造方法 n = " + n);

}

//私有构造方法

private Student(int age){

System.out.println(

“私有的构造方法 年龄:”+ age);

}

}

共有6个构造方法;

测试类:

package fanshe;

import java.lang.reflect.Constructor;

/*

* 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;

*

* 1.获取构造方法:

* 1).批量的方法:

* public Constructor[] getConstructors():所有"公有的"构造方法

public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

* 2).获取单个的方法,并调用:

* public Constructor getConstructor(Class… parameterTypes):获取单个的"公有的"构造方法:

* public Constructor getDeclaredConstructor(Class… parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

*

* 调用构造方法:

* Constructor–>newInstance(Object… initargs)

*/

public

class Constructors {

public static void main(String[] args) throws Exception {

//1.加载Class对象

Class clazz = Class.forName(

“fanshe.Student”);

//2.获取所有公有构造方法

System.out.println(

“**********************所有公有构造方法*********************************”);

Constructor[] conArray = clazz.getConstructors();

for(Constructor c : conArray){

System.out.println©;

}

System.out.println(

“************所有的构造方法(包括:私有、受保护、默认、公有)***************”);

conArray = clazz.getDeclaredConstructors();

for(Constructor c : conArray){

System.out.println©;

}

System.out.println(

“*****************获取公有、无参的构造方法*******************************”);

Constructor con = clazz.getConstructor(

null);

//1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型

//2>、返回的是描述这个无参构造函数的类对象。

System.out.println(

"con = " + con);

//调用构造方法

Object obj = con.newInstance();

// System.out.println("obj = " + obj);

// Student stu = (Student)obj;

System.out.println(

“******************获取私有构造方法,并调用*******************************”);

con = clazz.getDeclaredConstructor(

char.class);

System.out.println(con);

//调用构造方法

con.setAccessible(

true);

//暴力访问(忽略掉访问修饰符)

obj = con.newInstance(

‘男’);

}

}

后台输出:

**********************所有公有构造方法*********************************

public fanshe.Student(java.lang.String,

int)

public fanshe.Student(

char)

public fanshe.Student()

************所有的构造方法(包括:私有、受保护、默认、公有)***************

private fanshe.Student(

int)

protected fanshe.Student(

boolean)

public fanshe.Student(java.lang.String,

int)

public fanshe.Student(

char)

public fanshe.Student()

fanshe.Student(java.lang.String)

*****************获取公有、无参的构造方法*******************************

con =

public fanshe.Student()

调用了公有、无参构造方法执行了。。。

******************获取私有构造方法,并调用*******************************

public fanshe.Student(

char)

姓名:男

调用方法:

1.获取构造方法:

1).批量的方法:

public Constructor[] getConstructors():所有"公有的"构造方法

public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

2).获取单个的方法,并调用:

public Constructor getConstructor(Class… parameterTypes):获取单个的"公有的"构造方法:

public Constructor getDeclaredConstructor(Class… parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

调用构造方法:

Constructor–>newInstance(Object… initargs)

2、 newInstance是 Constructor类的方法(管理构造函数的类)

api的解释为:

**[]( )**newInstance(Object… initargs)

使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

它的返回值是T类型,所以newInstance是创建了一个构造方法的声明类的新实例对象。并为之调用

3、获取成员变量并调用


student类:

package fanshe.field;

public

class Student {

public Student(){

}

//**********字段*************//

public String name;

protected

int age;

char sex;

private String phoneNum;

@Override

public String toString() {

return

“Student [name=” + name +

“, age=” + age +

“, sex=” + sex

“, phoneNum=” + phoneNum +

“]”;

}

}

测试类:

package fanshe.field;

import java.lang.reflect.Field;

/*

* 获取成员变量并调用:

*

* 1.批量的

* 1).Field[] getFields():获取所有的"公有字段"

* 2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;

* 2.获取单个的:

* 1).public Field getField(String fieldName):获取某个"公有的"字段;

* 2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)

*

* 设置字段的值:

必看视频!获取2024年最新Java开发全套学习资料 备注Java

* Field --> public void set(Object obj,Object value):

* 参数说明:

* 1.obj:要设置的字段所在的对象;

* 2.value:要为字段设置的值;

*

*/

public

class Fields {

public static void main(String[] args) throws Exception {

//1.获取Class对象

Class stuClass = Class.forName(

“fanshe.field.Student”);

//2.获取字段

System.out.println(

“************获取所有公有的字段********************”);

Field[] fieldArray = stuClass.getFields();

for(Field f : fieldArray){

System.out.println(f);

}

System.out.println(

“************获取所有的字段(包括私有、受保护、默认的)********************”);

fieldArray = stuClass.getDeclaredFields();

for(Field f : fieldArray){

System.out.println(f);

}

System.out.println(

“*************获取公有字段**并调用***********************************”);

Field f = stuClass.getField(

“name”);

System.out.println(f);

//获取一个对象

Object obj = stuClass.getConstructor().newInstance();

//产生Student对象–》Student stu = new Student();

//为字段设置值

f.set(obj,

“刘德华”);

//为Student对象中的name属性赋值–》stu.name = “刘德华”

//验证

Student stu = (Student)obj;

System.out.println(

“验证姓名:” + stu.name);

System.out.println(

“**************获取私有字段****并调用********************************”);

f = stuClass.getDeclaredField(

“phoneNum”);

System.out.println(f);

f.setAccessible(

true);

//暴力反射,解除私有限定

f.set(obj,

“18888889999”);

System.out.println(

“验证电话:” + stu);

}

}

后台输出:

************获取所有公有的字段********************

public java.lang.String fanshe.field.Student.name

************获取所有的字段(包括私有、受保护、默认的)********************

public java.lang.String fanshe.field.Student.name

protected

int fanshe.field.Student.age

char fanshe.field.Student.sex

private java.lang.String fanshe.field.Student.phoneNum

*************获取公有字段**并调用***********************************

public java.lang.String fanshe.field.Student.name

验证姓名:刘德华

**************获取私有字段****并调用********************************

private java.lang.String fanshe.field.Student.phoneNum

验证电话:Student [name=刘德华, age=

0, sex=

由此可见

调用字段时:需要传递两个参数:

Object obj = stuClass.getConstructor().newInstance();//产生Student对象–》Student stu = new Student();

//为字段设置值

f.set(obj, “刘德华”);//为Student对象中的name属性赋值–》stu.name = “刘德华”

第一个参数:要传入设置的对象,第二个参数:要传入实参

4、获取成员方法并调用


student类:

package fanshe.method;

public

class Student {

//**************成员方法***************//

public void show1(String s){

System.out.println(

"调用了:公有的,String参数的show1(): s = " + s);

}

protected void show2(){

System.out.println(

“调用了:受保护的,无参的show2()”);

}

void show3(){

System.out.println(

“调用了:默认的,无参的show3()”);

}

private String show4(int age){

System.out.println(

"调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);

return

“abcd”;

}

}

测试类:

package fanshe.method;

import java.lang.reflect.Method;

/*

* 获取成员方法并调用:

*

* 1.批量的:

* public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)

* public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)

* 2.获取单个的:

* public Method getMethod(String name,Class<?>… parameterTypes):

* 参数:

* name : 方法名;

* Class … : 形参的Class类型对象

* public Method getDeclaredMethod(String name,Class<?>… parameterTypes)

*

* 调用方法:

* Method --> public Object invoke(Object obj,Object… args):

* 参数说明:

* obj : 要调用方法的对象;

* args:调用方式时所传递的实参;

):

*/

public

class MethodClass {

public static void main(String[] args) throws Exception {

//1.获取Class对象

Class stuClass = Class.forName(

“fanshe.method.Student”);

//2.获取所有公有方法

System.out.println(

“***************获取所有的”公有“方法*******************”);

stuClass.getMethods();

Method[] methodArray = stuClass.getMethods();

for(Method m : methodArray){

System.out.println(m);

}

System.out.println(

“***************获取所有的方法,包括私有的*******************”);

methodArray = stuClass.getDeclaredMethods();

for(Method m : methodArray){

System.out.println(m);

}

System.out.println(

“***************获取公有的show1()方法*******************”);

Method m = stuClass.getMethod(

“show1”, String.class);

System.out.println(m);

//实例化一个Student对象

Object obj = stuClass.getConstructor().newInstance();

m.invoke(obj,

“刘德华”);

System.out.println(

“***************获取私有的show4()方法******************”);

m = stuClass.getDeclaredMethod(

“show4”,

int.class);

System.out.println(m);

m.setAccessible(

true);

//解除私有限定

Object result = m.invoke(obj,

20);

//需要两个参数,一个是要调用的对象(获取有反射),一个是实参

System.out.println(

“返回值:” + result);

}

}

控制台输出:

***************获取所有的”公有“方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

public

final

void java.lang.Object.wait(

long,

int)

throws java.lang.InterruptedException

public

final

native

void java.lang.Object.wait(

long)

throws java.lang.InterruptedException

public

final

void java.lang.Object.wait()

throws java.lang.InterruptedException

public

boolean java.lang.Object.equals(java.lang.Object)

public java.lang.String java.lang.Object.toString()

public

native

int java.lang.Object.hashCode()

public

final

native java.lang.Class java.lang.Object.getClass()

public

final

native

void java.lang.Object.notify()

public

final

native

void java.lang.Object.notifyAll()

***************获取所有的方法,包括私有的*******************

public

void fanshe.method.Student.show1(java.lang.String)

private java.lang.String fanshe.method.Student.show4(

int)

protected

void fanshe.method.Student.show2()

void fanshe.method.Student.show3()

***************获取公有的show1()方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

调用了:公有的,String参数的show1(): s = 刘德华

***************获取私有的show4()方法******************

private java.lang.String fanshe.method.Student.show4(

int)

调用了,私有的,并且有返回值的,

int参数的show4(): age =

20

返回值:abcd

由此可见:

m = stuClass.getDeclaredMethod(“show4”, int.class);//调用制定方法(所有包括私有的),需要传入两个参数,第一个是调用的方法名称,第二个是方法的形参类型,切记是类型。

System.out.println(m);

m.setAccessible(true);//解除私有限定

Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参

System.out.println(“返回值:” + result);//

控制台输出:

***************获取所有的”公有“方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

public

final

void java.lang.Object.wait(

long,

int)

throws java.lang.InterruptedException

public

final

native

void java.lang.Object.wait(

long)

throws java.lang.InterruptedException

public

final

void java.lang.Object.wait()

throws java.lang.InterruptedException

public

boolean java.lang.Object.equals(java.lang.Object)

public java.lang.String java.lang.Object.toString()

public

native

int java.lang.Object.hashCode()

public

final

native java.lang.Class java.lang.Object.getClass()

public

final

native

void java.lang.Object.notify()

public

final

native

void java.lang.Object.notifyAll()

***************获取所有的方法,包括私有的*******************

public

void fanshe.method.Student.show1(java.lang.String)

private java.lang.String fanshe.method.Student.show4(

int)

protected

void fanshe.method.Student.show2()

void fanshe.method.Student.show3()

***************获取公有的show1()方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

调用了:公有的,String参数的show1(): s = 刘德华

***************获取私有的show4()方法******************

private java.lang.String fanshe.method.Student.show4(

int)

调用了,私有的,并且有返回值的,

int参数的show4(): age =

20

返回值:abcd

其实这里的成员方法:在模型中有属性一词,就是那些setter()方法和getter()方法。还有字段组成,这些内容在内省中详解

5、反射main方法


student类:

package fanshe.main;

public

class Student {

public static void main(String[] args) {

System.out.println(

“main方法执行了。。。”);

}

}

测试类:

package fanshe.main;

import java.lang.reflect.Method;

/**

* 获取Student类的main方法、不要与当前的main方法搞混了

*/

public

class Main {

public static void main(String[] args) {

最后

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?

既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?

架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

控制台输出:

***************获取所有的”公有“方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

public

final

void java.lang.Object.wait(

long,

int)

throws java.lang.InterruptedException

public

final

native

void java.lang.Object.wait(

long)

throws java.lang.InterruptedException

public

final

void java.lang.Object.wait()

throws java.lang.InterruptedException

public

boolean java.lang.Object.equals(java.lang.Object)

public java.lang.String java.lang.Object.toString()

public

native

int java.lang.Object.hashCode()

public

final

native java.lang.Class java.lang.Object.getClass()

public

final

native

void java.lang.Object.notify()

public

final

native

void java.lang.Object.notifyAll()

***************获取所有的方法,包括私有的*******************

public

void fanshe.method.Student.show1(java.lang.String)

private java.lang.String fanshe.method.Student.show4(

int)

protected

void fanshe.method.Student.show2()

void fanshe.method.Student.show3()

***************获取公有的show1()方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

调用了:公有的,String参数的show1(): s = 刘德华

***************获取私有的show4()方法******************

private java.lang.String fanshe.method.Student.show4(

int)

调用了,私有的,并且有返回值的,

int参数的show4(): age =

20

返回值:abcd

由此可见:

m = stuClass.getDeclaredMethod(“show4”, int.class);//调用制定方法(所有包括私有的),需要传入两个参数,第一个是调用的方法名称,第二个是方法的形参类型,切记是类型。

System.out.println(m);

m.setAccessible(true);//解除私有限定

Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参

System.out.println(“返回值:” + result);//

控制台输出:

***************获取所有的”公有“方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

public

final

void java.lang.Object.wait(

long,

int)

throws java.lang.InterruptedException

public

final

native

void java.lang.Object.wait(

long)

throws java.lang.InterruptedException

public

final

void java.lang.Object.wait()

throws java.lang.InterruptedException

public

boolean java.lang.Object.equals(java.lang.Object)

public java.lang.String java.lang.Object.toString()

public

native

int java.lang.Object.hashCode()

public

final

native java.lang.Class java.lang.Object.getClass()

public

final

native

void java.lang.Object.notify()

public

final

native

void java.lang.Object.notifyAll()

***************获取所有的方法,包括私有的*******************

public

void fanshe.method.Student.show1(java.lang.String)

private java.lang.String fanshe.method.Student.show4(

int)

protected

void fanshe.method.Student.show2()

void fanshe.method.Student.show3()

***************获取公有的show1()方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

调用了:公有的,String参数的show1(): s = 刘德华

***************获取私有的show4()方法******************

private java.lang.String fanshe.method.Student.show4(

int)

调用了,私有的,并且有返回值的,

int参数的show4(): age =

20

返回值:abcd

其实这里的成员方法:在模型中有属性一词,就是那些setter()方法和getter()方法。还有字段组成,这些内容在内省中详解

5、反射main方法


student类:

package fanshe.main;

public

class Student {

public static void main(String[] args) {

System.out.println(

“main方法执行了。。。”);

}

}

测试类:

package fanshe.main;

import java.lang.reflect.Method;

/**

* 获取Student类的main方法、不要与当前的main方法搞混了

*/

public

class Main {

public static void main(String[] args) {

最后

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?

既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?

架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

[外链图片转存中…(img-AeI63dwd-1716455218295)]

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值