您的位置:首页 > 游戏 > 游戏 > 网页制作平台播放视频_百度站点提交工具_百度怎么注册自己的店铺_新闻头条新闻

网页制作平台播放视频_百度站点提交工具_百度怎么注册自己的店铺_新闻头条新闻

2024/11/20 19:40:23 来源:https://blog.csdn.net/mybluesky1983/article/details/142524907  浏览:    关键词:网页制作平台播放视频_百度站点提交工具_百度怎么注册自己的店铺_新闻头条新闻
网页制作平台播放视频_百度站点提交工具_百度怎么注册自己的店铺_新闻头条新闻

反射:reflection

  • 程序可以访问、检测和修改它本身状态或行为的能力,即自描述和自控制。
  • 可以在运行时加载、探知和使用编译期间完全未知的类。
  • 给Java插上动态语言特性的翅膀,弥补强类型语言的不足
  • java.lang.reflect包,在Java2时代就有,在Java5得到完善
  • 在运行中分析类的能力
  • 在运行中查看和操作对象
  1. 基于反射自由创建对象
  2. 反射构建出无法直接访问的类
  3. set或者get到无法访问的成员变量
  4. 调用不可访问的方法实现通用的数组操作代码
  • 类似函数指针的功能
创建对象

问题:如何创造一个对象来调用他的方法?

方法1:静态编码并编译

public class A {public void hello(){System.out.println("hello from A");}
}//第一种 直接new 调用构造函数
A obj1 = new A();
obj.hello();

方法2 克隆

public class B implements Cloneable {public void hello(){System.out.println("hello from B");}protected Object clone() throws CloneNOtSupportedException{return super.clone();}
}    //第二种 clone
//obj3 是obj2的克隆对象  没有调用构造函数
B obj2 = new B();
obj.hello();B obj3 = (B) obj2.clone();
obj3.hello();

方法3:序列化(serialization)和反序列化(deserialization)
 


public class cimplements serializable{private static final long serialVersionUID= 1L;public void hello(){System.out.println("hello from);}
}
//第三种序列化 没有调用构造函数
//序列化会引发安全漏洞,未来将被移除出JDK,请谨慎使用!!!
C obj4 = new C();
Objectoutputstream out = new objectoutputstream(new Fileoutputstream("data.obj"));
out.writeobiect(obj4);
out.close();ObjectInputstream in = new objectInputstream(new rileInputstream("data.obj"));
C obi5=(C)in.readobject();
in.close();
obj5.hel1o();

方法4和5  : 反射

//第四种 newInstance 调用构造函数
Object obj6= class.forName("A").newInstance();
Method m= Class.forName("A").getMethod("hello");
m.invoke(obj6);
A obj7 =(A)Class.forName("A").newInstance();//第五种 newInstance 调用构造函数
Constructor<A> constructor= A.class.getConstructor();
A obj8= constructor.newInstance();
obj8.hello();
Class :类型标识


JVM为每个对象都保留其类型标识信息(Runtime TypeIdentification)
 

三种获取方式
String s1="abc";Class c1= s1.getclass();
System.out.println(c1.getName());Class c2= Class.forName("java.lang.String");
System.out.println(c2.getName());Class c3= string.class;
System.out.println(c3.getName());

Class 类型标识 可获取  成员变量、方法、构造函数、修饰符、包、父类、父接口…

getFields();  getDeclareFields()

getMethods(); getDeclareMethods();

getPackage();

getInterfaces();

getConstructors();

getModifiers();

getSuperClass();

getAnnotations();

Filed: 成员变量

class A 
{public int age;private String name;public A(int age, String name){this.age = age'this.name = name;}
}A obj = new A(20,"Tom" );
Class c= obj.getclass()//获取本类及父类所有的public字段
Field[] fs = c.getrields();
System.out.println(fs[0].getName()+ ":"+ fs[0].get(obj));//获取本类所有声明的字段
Field[] fs2=c.getDeclaredrields();
for(rield f : fs2)
{f.setAccessible(true);//可以使得对象的属性 private 临时变为publicSystem.out.println(f.getName()+":" + f.get(obj));
}

Method:成员方法

class B{public void f1(){out.println("B.f1()...”);]private string f2(string s){out.println("B.f2()...");return s;}
}B obj= new B();
Class c= obj.getClass();// 获取pub1ic方法 包括父类和父接口
Method[] ms = c.getMethods();
for(Method m:ms){if("f1".equals (m.getName())){m.invoke(obj, null);}
}//获得该类的所有方法
Method[] ms2=c.getDeclaredMethods();
for(Method m:ms2){if ("f2".eauals (m.aetName())){m.setAccessible(true);string result(string)m.invoke (obj,"abc");out.println(result);}
}

Constructor:构造函数

class D
{private int num,public p(){this.num= 10;}public D(int num){this.num= num;}public void printNum(){System.out.println(this.num);}
}D d = new D();
Class c = d.getclass();Constructorll cons=c.getconstructors();
for(Constructor con:cons){if (con.getParameterCount()>0) {//有参构造函数D obj=(D)con.newInstance(100);obj.printNum();} else {//无参构造函数D obj=(D) con.newInstance();obj.printNum();}
]

父类/父接口

class rather { }class Sone xtends Father implements cloneable, comparable
{protected object clone()throws cloneNotsupportedrxception{return super.clone();}public int compareTo(object o){return 0;}
}Son son = new son();
Class c= son.getclass();Class father=c.getsuperclass();
system.out.println(father.getName());Class[] inters = c.getInterfaces();
for(Class inter : inters)
{System.out.println(inter.getName());
}
反射的应用

数据库链接

JDBC
Connectlon, 连接到各个不同数据库
//构建Java和数据库之间的桥梁介质
try {Class.forName("com.mysql.jdbc.Driver");
//将类加载到JVM  等同于下面这句//Class.forName(className,true,currentroader)//通知类加载器加载此类的class文件,system.out.println("注册驱动成功!);
}catch(ClassNotFoundException e1){System.out.println("注册驱动失败!);e1.printstackTrace();return;
}//构建Java和数据库之间的桥梁:URL,用户名,密码
conn = DriverManager.getConnection(url,"root","123456");
//DriverManager将会挑选加载合适的驱动类,并采用getconnection方法连接

数组扩充

给定一个数组(任意类型),将其长度扩大一倍

  • Java的数组一旦创建,其长度是不再更改的
  • 新建一个大数组(相同类型),然后将旧数组的内容拷贝过去
package org.example.defaultmethod;import java.lang.reflect.Array;public class ArrayCopy {public static void main(String[] args) {int[] a = {1,2,3,4,5};a = (int[]) goodCopy(a,10);for (int i:a) {System.out.println(i);}}public static Object goodCopy(Object oldArray, int newLength) {// Array类型Class c = oldArray.getClass();//获取数组中的单个元素类型Class componentType = c.getComponentType();// 旧数组长度int oldLength = Array.getLength(oldArray);// 新数组Object newArray = Array.newInstance(componentType, newLength);//拷贝旧数据System.arraycopy(oldArray, 0,newArray,0,oldLength);return newArray;}
}

动态执行方法

给定类名、方法名,即可执行 --加上定时器,即可做定时任务执行

package org.example.defaultmethod;import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class TimeTask {Timer timer = new Timer();Calendar now = Calendar.getInstance();now.set(Calendar.SECOND,now.get(Calendar.SECOND)+1);Date runDate = now.getTime();MyTask task2 = new MyTask();timer.scheduleAtFixedRate(task2, runDate,3000);
}class Worker {public static void hello(){System.out.println("Hello java!");}
}class MyTask extends TimerTask {public void run() {try {Method m = Class.forName("Worker").getClass().getMethod("hello");m.invoke(null);//静态方法可以不用new对家} catch (Exception e) {e.printStackTrace();}}
}

Json和Java对象互转

class Person {private String name;private String emai1;public string getName()return name;}public string getEmail(){return email;}
}Gson gson=new Gson();String s = "{\"name\":\"Jo\""string"email ": "a@b.com "}";
Person p = gson.fromJson(s,Person.class);
System.out.println(p.getName ());
System.out.println(p.getEmail());//底层实现Field[]fields =raw.getDeclaredFields();
for (Field field :fields){boolean serialize=excludeField(field,true);boolean deserialize=excludeField(field,false);if(!serialize && !deserialize){continue;}accessor.makeAccessible(field);
}object fieldValue =typeAdapter.read(reader);
if(fieldValue !=null!isPrimitive){field.set(value, fieldValue);}

Tomcat的Servlet创建
 

<!--web.xml-->
<!-- servlet definition -->
<serylet><servlet-name>Init</servlet-name><servlet-class>service.Init</servlet-class>
</servlet>public object newInstance(final String className,final ClassLoader classLoader) throws IllegalAccessException ,NamingException,InvocationTargetException,IllegalArgumentException,InstantiationException,ClassNotFoundException,NoSuchMethodException,SecurityException {Class<?>clazz=classLoader.loadClass(className);return newInstance(clazz.getConstructor().newInstance(),clazz);
}

MyBatis的OR/M
MappingMyBatis:OR/M(Object-Relation Mapping) 数据库表和Java的POIO/DAO类对应关系

 

public class Reflector {private final Class<?>type;private final String[] wreadablePropertyNames;private final String[] writablePropertyNames;private final Map<String,Invoker> setMehthods =   newHashMap<>();private final Map<String,Invoker> getMehthods =   newHashMap<>();private final Map<String,Class<?>> setTypes = new HashMap<>();private final Map<String,Class<?>> getTypes = new HashMap<>();private Construetor<?> defaultConstructor;private Map<stringnew HashMap<>()Strind>caseInsensitivePropertyMappublic Reflector(Class<?>ClazZ){type = clazz;addDefaultConstructor(clazz);addGetMethods(clazz):addsetMethods(clazz);addFields(clazz);readablePropertyNames = getMethods.kevset().toArray(new String[0]);writablePropertyNames = setMethods.kevset().toArray(new String[0]);}
|

Spring Framework的Bean容器
SpringFramework:JavaEE的主要框架 IoC的Bean容器(HashMap)

org.reflections 
Reflection的增强工具包  第三方增强包

https://github.com/ronmamo/reflections
Java runtime metadata analysis

  • 获取某类的所有子类型
  • 获取有特殊annotation的类型或者成员变量/方法
  • 根据正则表达式获取资源(类/成员变量/方法)
  • 根据组合条件查询相应的方法

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com