实例class类
public class Person {
public String name;
int age;
}
----------------------------------------------------------------------------------------------
public class Test {
public static void main (String[] args) {
Person p = new Person ();
Class clazz = p.getClass();
Class c0 = Person.class;
Class c1 = p.getClass();
try {
Class c2 = Class.forName("day14.Person" );
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
通过反射调用类的完整结构
所用到的对象与接口
public interface Move {
void moveType () ;
}
----------------------------------------------------------------------------------------------
public interface Study {
void studyInfo () ;
}
----------------------------------------------------------------------------------------------
public class Student extends Person implements Move ,Study {
public Student () {
System.out .println("调用的是public Student()" );
}
public Student (String school ) {
this .school = school;
System.out .println("调用的是public Student(String school)" );
}
private Student (String name,int age ) {
this .name = name;
this .age = age;
System.out .println("调用的是private Student(String name,int age)" );
}
public String school;
private String privateField;
public void showInfo () {
System.out .println("学校是:" + this .school);
}
@Override
public void studyInfo () {
System.out .println("学习的中学的知识" );
}
@Override
public void moveType () {
System.out .println("骑自行车上学" );
}
private void test (String name ) {
System.out .println("这是私有方法private void test(String name)" );
}
public String getSchool () {
return this .school;
}
public void setInfo (String name,String school ) {
this .name = name;
this .school = school;
System.out .println("这个是setInfo(String name,String school)方法" );
}
public void setInfo (int age ) {
System.out .println("这个是public void setInfo(int age)方法" );
}
}
实现的全部接口
public class Test1 {
public static void main (String[] args) {
try {
Class clazz = Class.forName("day14.Student" );
(以上部分省略)
Class superClazz = clazz.getSuperclass();
System.out.println("父类:" + superClazz.getName());
(以下部分省略)
} catch (Exception e) {
e.printStackTrace();
}
}
}
所继承的父类
public class Test1 {
public static void main (String [] args ) {
try {
Class clazz = Class .forName ("day14.Student" );
(以上部分省略)
Class [] interfaces = clazz.getInterfaces ();
for (Class c : interfaces){
System .out .println ("接口:" + c.getName ());
}
(以下部分省略)
} catch (Exception e) {
e.printStackTrace ();
}
}
}
全部的构造器
Constructor[] cons = clazz.getConstructors();
for (Constructor c : cons){
System.out .println("构造方法名称:" + c.getName());
System.out .println("构造方法:" + c.getName() + "的修饰符是:" + c.getModifiers());
Class[] paramClazz = c.getParameterTypes();
for (Class pc : paramClazz){
System.out .println("构造方法:" + c.getName() + "的参数类型是:" + pc.getName());
}
}
-------------------------------------------------------------------------------------
Constructor[] cons1 = clazz.getDeclaredConstructors();
for (Constructor c : cons1){
System.out .println("-------------------------------------" );
System.out .println("构造方法名称:" + c.getName());
System.out .println("构造方法:" + c.getName() + "的修饰符是:" + c.getModifiers());
Class[] paramClazz = c.getParameterTypes();
for (Class pc : paramClazz){
System.out .println("构造方法:" + c.getName() + "的参数类型是:" + pc.getName());
}
System.out .println("-------------------------------------" );
}
利用反射构造方法创建对象
Object obj = clazz.newInstance();
Student stu = (Student)obj;
------------------------------------------------------------
Constructor c = clazz.getConstructor(String.class);
Student stu1 = (Student)c.newInstance("第一中学" );
System.out.println(stu1.school);
------------------------------------------------------------
Constructor c = clazz.getDeclaredConstructor(String.class,int .class);
c.setAccessible(true );
Student stu = (Student)c.newInstance("zhangsan" ,12 );
全部的方法
<!-- Method[] ms = clazz.getMethods();
Method[] ms = clazz.getDeclaredMethods();
for (Method m : ms){
System.out .println("方法名:" + m.getName());
System.out .println("返回值类型:" + m.getReturnType());
System.out .println("修饰符:" + m.getModifiers());
Class[] pcs = m.getParameterTypes();
if (pcs != null && pcs.length > 0 ){
for (Class pc : pcs){
System.out .println("参数类型:" + pc.getName());
}
}
System.out .println("==============================================" );
}
全部的Field(即属性)
Field[] fs = clazz.getDeclaredFields();//获取本类的(不包括父类的属性)所有的属性,包括私有
for(Field f : fs){
System.out.println("修饰符:" + f.getModifiers());
System.out.println("属性的类型:" + f.getType());
System.out.println("属性的名称:" + f.getName());
}
类所在的包
Package p = clazz.getPackage();
System.out .println(p.getName());
反射调用公有代码
Constructor con = clazz .getConstructor () ;
Object obj = con.newInstance();
调用公有方法
Method m = clazz.getMethod("setInfo" , String .class ,String .class );
m.invoke(obj, "zhangsan" ,"第一中学" );
调用私有方法
Method m1 = clazz.getDeclaredMethod ("test" , String.class );
m1.setAccessible (true );
m1.invoke (obj, "李四" );
反射调用重载方法
Method m2 = clazz.getMethod ("setInfo" , int .class );
m2.invoke (obj, 1 );
反射调用有返回值的方法
Method m3 = clazz.getMethod("getSchool" );
String school = (String)m3.invoke(obj);
System.out.println(school);
反射调用公有属性
Field f = clazz.getField("school" );
f.set (stu, "第三中学" );
String school = (String )f.get (stu);
System.out.println(school);
反射调用私有属性
Field f1 = clazz.getDeclaredField("privateField" );
f1.setAccessible(true );
f1.set (stu, "测试私有属性" );
System.out .println(f1.get (stu));
动态代理
理解:就是很多类绑在一起,同时改变,加入同一方法
public class TestDemoImpl implements ITestDemo {
@Override
public void test1 ( ) {
System .out .println ("执行test1()方法" );
}
@Override
public void test2 ( ) {
System .out .println ("执行test2()方法" );
}
}
------------------------动态代理类--------------------------------
public class ProxyDemo implements InvocationHandler {
Object obj;
public ProxyDemo (Object obj){
this .obj = obj;
}
@Override
public Object invoke (Object proxy, Method method, Object [] args)
throws Throwable {
System .out .println (method.getName () + " 方法开始执行" );
Object result = method.invoke (this .obj , args);
System .out .println (method.getName () + " 方法执行完毕" );
return result;
}
}
-------------------------------------------------------------------
public class Test2 {
public static void main (String [] args ) {
ITestDemo test = new TestDemoImpl ();
test.test1 ();
test.test2 ();
System .out .println ("======================" );
InvocationHandler handler = new ProxyDemo (test);
ITestDemo t = (ITestDemo )Proxy .newProxyInstance (handler.getClass ().getClassLoader (), test.getClass ().getInterfaces (), handler);
t.test1 ();
System .out .println ("-----------------------" );
t.test2 ();
}
}
-----------------------------执行结果------------------------------------
执行test1 ()方法
执行test2 ()方法
======================
test1 方法开始执行
执行test1 ()方法
test1 方法执行完毕
-----------------------
test2 方法开始执行
执行test2 ()方法
test2 方法执行完毕
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律