Java通过反射调用构造方法和一般方法

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

        先说构造方法,在使用Class类中的,newInstance() 取得实例化对象时,会出现一些问题。看下面出错的代码:

package com.jmd.bingo;
class Person {
	private String name;
	private int age;
//	public Person() {
//		this.name = "bingo";
//		this.age = 21;
//	}
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String toString() {
		return "name:"+ this.name+",age:"+this.age;
	}
	
}
public class Fs {
	public static void main(String[] args) {
			Class<?> cls;
			try {
				cls = Class.forName("com.jmd.bingo.Person");//通过反射实例化Person类对象。
				Person p = (Person)cls.newInstance();
				System.out.println(p);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
	}
}

错误提示:


        出错的原因是Person类没有提供无参构造函数,最简单的解决办法就是把写一个无参构造。那么,我就不写呢?办法还是有的。看上面的报错信息:”at java.lang.Class.getConstructor0(Unknown Source)“  可知Class类中有个getConstructor()方法,可以找到构造方法。那么就在getConstructor()上动动手脚。给它明确指定构造方法。

public class Fs {
	public static void main(String[] args) {
			Class<?> cls;
			try {
				cls = Class.forName("com.jmd.bingo.Person");//通过反射实例化Person类对象。
				Constructor<?> cons = cls.getConstructor(String.class,int.class);
				Person p = (Person)cons.newInstance("张三",18);
				System.out.println(p);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
	}
}

getConstructor()方法的参数是,被指定的构造方法的参数类型.class。通过Constructor对象的newInstance()方法去实例化对象。 还是挺麻烦的吧,所以,类中一定要写无参构造。

 

反射调用一般方法:

        类中的一般方法的调用一定是在实例化该类对象之后调用的,反射也不例外。getMethod() 取得方法,invoke()方法执行函数。 下面代码实现了,只给定类名,和属性名,设置相关属性。一定要用到反射。

public Method getMethod(String name,
                        Class<?>... parameterTypes)
                 throws NoSuchMethodException,
                        SecurityException       
参数分别是 方法名,参数类型

public Object invoke(Object obj,
                     Object... args)
              throws IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException    参数是 执行方法的对象,和方法的参数
package com.jmd.bingo;

import java.lang.reflect.Method;

class Person {
	private String name;
	private int age;
	public Person() {
		
	}
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String toString() {
		return "name:"+ this.name+",age:"+this.age;
	}
	
}
public class Fs {
	public static void main(String[] args) throws Exception {
		String attribute = "name"; //方法名中的N大写,后面转换。
		Class<?> cls = Class.forName("com.jmd.bingo.Person");//通过反射实例化Person类对象。
		Person p = (Person)cls.newInstance();
		Method setMethod = cls.getMethod("set"+upper(attribute), String.class); //方法名,参数类型
		Method getMethod = cls.getMethod("get"+upper(attribute));
		setMethod.invoke(p, "张三");
		System.out.println(getMethod.invoke(p));
	}
	public static String upper(String str) {
		return str.substring(0,1).toUpperCase() + str.substring(1);
	}
}

最终输出: 张三

Java反射——访问构造方法 反射 通过Java反射机制,可以在程序中访问已经装载到JVM中的Java对象的描述,实现访问,检测修改描述Java对象本身信息的功能。通过反射可以访问构造方法,成员变量,成员方法。 访问构造方法 利用Constructor对象可以操纵相应的构造方法。 Constructor类中提供的常用方法方法 说明 isVarArgs() 查看该构造方法是否允许带有可变数量的参数,如... 阅读详情

相关推荐

Java反射获取类的构造方法、属性成员方法及使用

public class ReflectTest { public static void main(String[] args) {//com.generic.Manager //获取输入的类的名称 String name; if(args.length>0) name = args[0]; else{ Scanner in = new Scanner(Syste...

Anna4的博客 1488

Java 反射使用大全

好多年前自己记的关于Java反射的笔记,这么些年下来,自己用到反射的时候就看这一份就够了。但是笔记以文件形式存放不方便,所以将其放到CSDN中,也希望能给更多小伙伴带来帮助。

朱豪凯的博客 9974

Java重点:反射机制的使用

J2EE中的反射(Reflection)是指在程序运行期间访问、检测修改自身的状态或行为。通过反射,可以动态地获取一个类的所有成员变量、方法构造函数等信息,并且可以在运行时调用这些成员。在J2EE中,反射可以地,以及其他能的应用程序。什么是反射反射(Reflection)是一种在运行时动态地获取操作对象的能力,它允许程序通过对象的类类型来了解对象的成员方法,并且可以在运行时调用这些成员方法

无法自律的人的博客 4243

JAVA反射调用方法

的第一个参数是对象实例,即在哪个实例上调用方法,后面的可变参数要与方法参数一致,否则将报错。如果获取到的Method表示一个静态方法调用静态方法时,由于无需指定实例对象,所以。使用反射调用方法时,仍然遵循多态原则:即总是调用实际类型的覆写方法(如果存在)。先得到 Method 对象 然后再调用 invoke 方法。对象时,就可以对它进行调用。获取该方法实例,但直接对其调用将得到一个。,不同的bit表示不同的含义。实例时,调用方法到底是哪个?:返回方法的修饰符,它是一个。对象,同样的,可以通过。

justlpf的专栏 3792

java反射获取方法以及调用方法

Class类中获取方法://获取包括自身继承(实现)过来的所有的public方法——Method不支持泛型,即后面不接//获取自身所有的方法(private、public、protected,访问权限无关),不包括继承的在jdk1.8后可以直接获取私有属性的方法不需要设置权限 但是仅限于getDeclaredMethod方法 对于Method方法仍然需要设置权限。//表示获取指定的一个公共的方法,包括继承的参数: methodName:表示获取的方法的名字。

askuld的博客 2772

java:通过反射调用类的方法

java:通过反射调用类的方法

听海边涛声 1284

反射方法介绍

反射可以获得类的构造方法一般方法、变量。依次举例演示。 关于getDeclaredMethod()、setAccessible(),见:Class 的newInstance()Constructor的newInstance() 获取字节码对象的三种方法: 1、类名.class例如...

chuyuanxie5276的博客 136

Java反射的运用

java反射之直接运用java反射定义 java反射定义 在java运行中,对于任意的一个类,都能知道他的属性方法,对于任意一个对象,能调用任意一个属性方法 ##获取反射的三种方式 Object -》 getclass 任何数据类型(包括基本数据类型)都有一个“静态”的class属性 通过静态类的方式,forName(String url) 这个是常用的 推荐第三中,第一个已经可以实例化,第二种需要导入jar,第三种只要知道路径就行。 package fanshe; /** * 获取Class

海的博客 269

Java中的反射(2)——调用构造方法获取继承关系

无论是字段的访问、方法调用构造方法的动态实例化,还是继承关系的探索,反射都大大增强了Java的灵活性动态性。但同时,反射的使用也需要谨慎,特别是在性能安全性方面,需要权衡其优势潜在的开销。反射不仅能让我们获取类的构造方法,还能动态调用它们,甚至可以调用私有构造方法。类的获取与作用、字段的访问与修改、方法调用构造方法的动态实例化,以及类的继承关系接口的获取。:通过反射可以调用私有构造方法,这意味着我们可以绕过类的访问限制,创建原本不可直接实例化的类的对象。可以获取某个类的直接父类。

m0_53926113的博客 1297

Java反射构造方法反射

上一篇Java反射之Class类我们介绍了java反射的关键类Class, 反射就是由一个java类映射得到一个java类。 所以,我们自然能想到,一个类中应该有哪些属性,这里做个比方,人有名字年龄等属性,所有一个Person类中就会有name,age这两个属性,同理,一个类中也有构造方法,字段,方法等属性。 接下来我们首先了解构造方法,通过反射构造方法动态创建一个对象。 [一]Construct...

Oooops_的博客 1898

Java反射之获取构造方法,成员变量,成员方法以及反射的作用

Java中,反射是指程序在运行时动态地获取类的信息、调用方法访问属性的能力。通过反射,可以在运行时获取类的构造函数方法字段等信息,并且可以在运行时动态地创建对象、调用方法访问属性,而不需要在编译时知道类的具体信息。反射提供了一种机制,使得编写通用的、灵活的代码成为可能,但同时也会增加代码的复杂性性能开销。反射允许对封装类的字段(成员变量),方法(成员方法构造函数构造方法)的信息进行编程访问。

jungleirim的博客 1364

Java-反射以及反射调用类中方法

认识反射 反射是对象的反射处理操作。 先来看看“正”操作。 在默认情况下,必须要先导入一个包,而后才能产生类的实例化对象。 如下就是一个正操作。 import java.util.Date;//导入的包 public class Test{ public static void main(String[] args){ Date date = new Date();//产...

阿巴卡的博客 4773

Java反射:Class类、调用构造方法、访问字段、访问方法

Reflection

HakerDONG的博客 1171

访问构造方法反射

Java反射机制可以实现访问、检测修改Java对象本身信息的功能,在java.lang.reflect包下提供此功能。可以使程序员更加深入地控制程序的运行过程。可以理解为随时调用某个类的某个构造方法,成员方法,属性。以上就是今天要讲的内容,本文仅仅简单介绍了访问构造方法的使用,而反射提供了大量能使我们快速便捷地处理数据的函数方法,指正的内容欢迎在评论区中留言。

weixin_74141222的博客 1118

Java 反射 调用私有构造方法

  单例类: 1 package singleton; 2 3 public class SingletonTest { 4 5 // 私有构造方法 6 private SingletonTest(){ 7 8 System.out.println("无参数---构造----"); 9 ...

aotangai1607的博客 680

JAVA通过反射使用公共构造方法私有构造方法来创建对象(一)

JAVA通过反射来创建对象 JAVA反射机制是指在运行时去获取一个类的变量信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大地增强程序的灵活性,程序不需要在编译期就完成确定,在运行期仍然可以扩展。 创建Student类文件 Student类包含公共构造方法,也包含私有构造方法。 package com.csdn; public class Student { private String name; private int age; public

qq_36944952的博客 3650

如何使用反射创建类对象、构造方法调用方法属性等

一.反射的概念 1.1什么是反射反射就是把Java类中的各种成分映射成一个个的Java对象。例如,一个类有:成员变量,方法构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。 1.2 反射常用类 Class类—可获取类类的成员信息 Field类—可访问类的属性 Method类—可调用类的方法 Constructor类—可调用类的构造方法 ** ...

WhiteBear的博客 2768

学习反射3(反射获取构造方法

之前 学习了什么是反射?如何使用反射 来创建实体类对象?本篇博客进一步学习如何使用反射,获得实体类中的构造方法。温习以下反射的含义反射:允许程序在运行时获取类的内部信息(如成员变量、成员方法构造方法等),并能够动态操作这些信息。了解 Java中常说的” 世间万物皆对象“ :把任何东西都看成一个一个 对象来理解 就比如之后学习 获取 类中的构造方法,成员变量、成员方法 就是把它们封装成一个个对象。在本篇博客中,就是把 构造方法 封装成 Constructor 类中的对象如何获取对象通过Class。

等什么君!的博客 1257

通过反射获取某个类的所有构造方法

反射获取某个类的构造方法有4种方式: package 反射获取某个类的所有构造方法; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class ReflectTest08 { public static void main(Stri...

你今天真好看呀 3023
上一篇: Android 自定义View,并绘制简单图形
下一篇: Android 利用Service播放音乐
bingoCoder
博客等级 码龄9年 1401粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值