96SEO 2026-02-20 03:18 12
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

可以跟配置文件结合起来使用把要创建的对象信息和方法写在配置文件中。
Class.forName(com.i***ima.reflectdemo.Student);
//就是当Student.class这个文件加载到内存之后产生的字节码文件对象
//因为class文件在硬盘中是唯一的所以当这个文件加载到内存之后产生的对象也是唯一的
字节码文件就是通过java文件编译之后的class文件是在硬盘上真实存在的用眼睛能看到的
字节码文件对象当class文件加载到内存之后虚拟机自动创建出来的对象。
而我们的反射获取的是什么字节码文件对象这个对象在内存中是唯一的。
getConstructors()获得所有的构造只能public修饰Constructor?[]
getDeclaredConstructors()获得所有的构造包含private修饰ConstructorT
parameterTypes)获取指定构造只能public修饰ConstructorT
getDeclaredConstructor(Class?...
parameterTypes)获取指定构造包含private修饰
Class.forName(com.i***ima.reflectdemo.Student);
//2.获取构造方法对象//获取所有构造方法publicConstructor[]
{System.out.println(constructor);}
clazz.getDeclaredConstructors();
{System.out.println(constructor);}System.out.println();
clazz.getConstructor();System.out.println(con1);
clazz.getConstructor(String.class,int.class);System.out.println(con2);
System.out.println();//获取指定的构造(所有构造都可以获取到包括public包括private)Constructor
clazz.getDeclaredConstructor();System.out.println(con3);//了解
con1);//每一次获取构造方法对象的时候都会新new一个。
clazz.getDeclaredConstructor(String.class);System.out.println(con4);}
Class.forName(com.i***ima.a02reflectdemo1.Student);
Class.forName(com.i***ima.a02reflectdemo1.Student);
clazz.getDeclaredConstructor(String.class,
getFields()返回所有成员变量对象的数组只能拿public的Field[]
getDeclaredFields()返回所有成员变量对象的数组存在就能拿到Field
Class.forName(com.i***ima.reflectdemo.Student);
//2.获取成员变量的对象Field对象)只能获取public修饰的Field[]
System.out.println();//获得单个成员变量对象//如果获取的属性是不存在的那么会报异常//Field
clazz.getField(aaa);//System.out.println(field3);//NoSuchFieldException
clazz.getField(gender);System.out.println(field4);
System.out.println();//获取单个成员变量私有Field
clazz.getDeclaredField(name);System.out.println(field5);
Student(zhangsan,23,广州);Student
Class.forName(com.i***ima.reflectdemo.Student);
//2.获取name成员变量//field就表示name这个属性的对象Field
clazz.getDeclaredField(name);//临时修饰他的访问权限field.setAccessible(true);
//3.设置(修改)name的值//参数一表示要修改哪个对象的name//参数二表示要修改为多少field.set(s,wangwu);
//3.获取name的值//表示我要获取这个对象的name的值String
//4.打印结果System.out.println(result);
System.out.println(s);System.out.println(ss);
getMethods()返回所有成员方法对象的数组只能拿public的Method[]
getDeclaredMethods()返回所有成员方法对象的数组存在就能拿到Method
parameterTypes)返回单个成员方法对象只能拿public的Method
parameterTypes)返回单个成员方法对象存在就能拿到
Class.forName(com.i***ima.reflectdemo.Student);
//2.获取方法//getMethods可以获取父类中public修饰的方法Method[]
System.out.println();//获取所有的方法包含私有//但是只能获取自己类中的方法Method[]
System.out.println();//获取指定的方法空参Method
clazz.getMethod(sleep);System.out.println(method3);
clazz.getMethod(eat,String.class);System.out.println(method4);
clazz.getDeclaredMethod(playGame);System.out.println(method5);}
java.lang.reflect.InvocationTargetException;
Class.forName(com.i***ima.a02reflectdemo1.Student);//2.获取一个对象//需要用这个对象去调用方法Student
Student();//3.获取一个指定的方法//参数一方法名//参数二参数列表如果没有可以不写Method
clazz.getMethod(eat,String.class);//运行//参数一表示方法的调用对象//参数二方法在运行时需要的实际参数//注意点如果方法有返回值那么需要接收invoke的结果//如果方法没有返回值则不需要接收String
重庆小面);System.out.println(result);
study(){System.out.println(学生在学习);}
sleep(){System.out.println(学生在睡觉);}
something){System.out.println(学生在吃
第一个方向无视修饰符访问类中的内容。
但是这种操作在开发中一般不用都是框架底层来用的。
第二个方向反射可以跟配置文件结合起来使用动态的创建对象动态的调用方法。
集合中的泛型只在java文件中存在当编译成class文件之后就没有泛型了。
java.lang.reflect.InvocationTargetException;
//2.利用反射运行add方法去添加字符串//因为反射使用的是class字节码文件
//运行方法method.invoke(list,aaa);
//打印集合System.out.println(list);}
private修饰value而且没有对外提供getvalue和setvalue的方法。
所以在外界不能获取或修改value记录的地址值。
没有对外提供getvalue和setvalue的方法不能修改value记录的地址值
真正不可变的value数组的地址值里面的内容利用反射还是可以修改的比较危险//1.获取class对象
s.getClass();//2.获取value成员变量private
field.setAccessible(true);//3.获取value记录的地址值
100;System.out.println(s);//dbc
利用反射根据文件中的不同类名和方法名创建不同的对象并调用方法。
FileInputStream(day14-code\\prop.properties);prop.load(fis);fis.close();System.out.println(prop);String
Class.forName(classname);//3.要先创建这个类的对象Constructor
clazz.getDeclaredConstructor();con.setAccessible(true);Object
con.newInstance();System.out.println(o);//4.获取方法的对象Method
clazz.getDeclaredMethod(methodname);method.setAccessible(true);//5.运行方法method.invoke(o);}
classnamecom.i***ima.a02reflectdemo1.Student
{/*对于任意一个对象都可以把对象所有的字段名和值保存到文件中去*/Student
Student(小A,23,女,167.5,睡觉);Teacher
Teacher(播妞,10000);saveObject(s);}//把对象里面所有的成员变量名和值保存到本地文件中public
FileWriter(myreflect\\a.txt));//3.
{field.setAccessible(true);//获取成员变量的名字String
field.getName();//获取成员变量的值Object
field.get(obj);//写出数据bw.write(name
value);bw.newLine();}bw.close();}
切记一点代理可以增强或者拦截的方法都在接口中接口需要写在newProxyInstance的第二个参数里。
ProxyUtil.createProxy(大明星的对象);2.
再调用代理的唱歌方法代理对象.唱歌的方法(只因你太美);*///1.
ProxyUtil.createProxy(bigStar);//2.
proxy.sing(只因你太美);System.out.println(result);}
ProxyUtil.createProxy(大明星的对象);*
java.lang.reflect.Proxy类提供了为对象产生代理对象的方法public
h)参数一用于指定用哪个类加载器去加载生成的代理类参数二指定接口这些接口用于指定生成的代理长什么也就是有哪些方法参数三用来指定生成的代理对象要干什么事情*/Star
Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),//参数一用于指定用哪个类加载器去加载生成的代理类new
Class[]{Star.class},//参数二指定接口这些接口用于指定生成的代理长什么也就是有哪些方法//参数三用来指定生成的代理对象要干什么事情new
*/if(sing.equals(method.getName())){System.out.println(准备话筒收钱);}else
if(dance.equals(method.getName())){System.out.println(准备场地收钱);}//去找大明星开始唱歌或者跳舞//代码的表现形式调用大明星里面唱歌或者跳舞的方法return
method.invoke(bigStar,args);}});return
{//我们可以把所有想要被代理的方法定义在接口当中//唱歌public
name){System.out.println(this.name
dance(){System.out.println(this.name
在这个故事中经济人作为代理如果别人让邀请大明星去唱歌打篮球经纪人就增强功能。
但是如果别人让大明星去扫厕所经纪人就要拦截不会去调用大明星的方法。
Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new
{if(cleanWC.equals(method.getName())){System.out.println(拦截不调用大明星的方法);return
method.invoke(bigStar,args);}});return
对add方法进行增强对remove方法进行拦截对其他方法不拦截也不增强
{//动态代码可以增强也可以拦截//1.创建真正干活的人ArrayListString
ArrayList();//2.创建代理对象//参数一类加载器。
当前类名.class.getClassLoader()//
找到是谁把当前的类加载到内存中了我再麻烦他帮我干一件事情把后面的代理类也加载到内存//参数二是一个数组在数组里面写接口的字节码文件对象。
//
如果写了List那么表示代理可以代理List接口里面所有的方法对这些方法可以增强或者拦截//
因为ArrayList并没有实现这个接口那么就无法对这个接口里面的方法进行增强或拦截//参数三用来创建代理对象的匿名内部类List
Proxy.newProxyInstance(//参数一类加载器MyProxyDemo1.class.getClassLoader(),//参数二是一个数组表示代理对象能代理的方法范围new
Class[]{List.class},//参数三本质就是代理对象new
{Override//invoke方法参数的意义//参数一表示代理对象一般不用了解//参数二就是方法名我们可以对方法名进行判断是增强还是拦截//参数三就是下面第三步调用方法时传递的参数。
//举例1//list.add(阿玮好帅);//此时参数二就是add这个方法名//此时参数三
System.currentTimeMillis();//调用集合的方法真正的添加数据method.invoke(list,
System.currentTimeMillis();System.out.println(耗时时间
start));//需要进行返回返回值要跟真正增强或者拦截的方法保持一致return
if(method.getName().equals(remove)
Integer){System.out.println(拦截了按照索引删除的方法);return
if(method.getName().equals(remove)){System.out.println(拦截了按照对象删除的方法);return
false;}else{//如果当前调用的是其他方法,我们既不增强也不拦截method.invoke(list,args);return
null;}}});//3.调用方法//如果调用者是list就好比绕过了第二步的代码直接添加元素//如果调用者是代理对象此时代理才能帮我们增强或者拦截//每次调用方法的时候都不会直接操作集合//而是先调用代理里面的invoke在invoke方法中进行判断可以增强或者拦截proxyList.add(aaa);proxyList.add(bbb);proxyList.add(ccc);proxyList.add(ddd);proxyList.remove(0);proxyList.remove(aaa);//打印集合System.out.println(list);}
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback