一. Java反射机制

Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制同意程序在执行时透过Reflection APIs取得不论什么一个已知名称的class的内部信息,包含其modifiers(诸如public, static 等等)、superclass(比如Object)、实现之interfaces(比如Serializable)。也包含fields和methods的全部信息,并可于执行时改变fields内容或调用methods(包含被声明为private的field和method)。

二. 打印一个类的信息Demo

能够写一个Utils类来打印一个类的信息:

  1. ReflectUtils.java
  1. package com.example.test;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Modifier;
  7. import java.lang.reflect.Type;
  8.  
  9. public class ReflectUtils {
  10.  
  11. // 要打印的类
  12. private Class classTobePrint;
  13.  
  14. // 单例模式
  15. private static ReflectUtils reflectUtils = new ReflectUtils();
  16.  
  17. private ReflectUtils(){ }
  18.  
  19. public static ReflectUtils getInstance(){
  20. return reflectUtils;
  21. }
  22.  
  23. public ReflectUtils setClass(Class<?> c){
  24. this.classTobePrint = c;
  25. return reflectUtils;
  26. }
  27.  
  28. public ReflectUtils setClass(String className) throws ClassNotFoundException {
  29. this.classTobePrint = getClass(className);
  30. return reflectUtils;
  31. }
  32.  
  33. // 打印输出类的全部信息
  34. public void listAllInfo() throws ClassNotFoundException {
  35.  
  36. if ( classTobePrint == null ) {
  37. return ;
  38. }
  39.  
  40. // 要打印的类
  41. Class cc = classTobePrint;
  42.  
  43. // 输出父类名
  44. getSuperClassName(cc);
  45.  
  46. // 输出接口名
  47. getInterfaceInfo(cc);
  48.  
  49. // 输出构造函数
  50. getConstructInfo(cc.getDeclaredConstructors());
  51.  
  52. // 输出域
  53. getFildInfo(cc.getDeclaredFields());
  54.  
  55. // 输出方法
  56. getMethodsInfo(cc.getDeclaredMethods());
  57.  
  58. // 输出内部类
  59. getInerclassInfo(cc.getDeclaredClasses());
  60.  
  61. // 输出类载入器
  62. getClassLoaderInfo(cc);
  63.  
  64. // 复位classTobeTest
  65. classTobePrint = null;
  66. }
  67.  
  68. /**
  69. * 输出父类名
  70. */
  71. public void getSuperClassName(Class<?
  72.  
  73. > c) {
  74. System.out.println("\n父类");
  75. // Class<?> superClass = c.getSuperclass();
  76. // System.out.println(superClass.getName());
  77. Type t = c.getGenericSuperclass();
  78. if (t==null) {
  79. System.out.println("无父类");
  80. }
  81. System.out.println(t);
  82. }
  83.  
  84. /**
  85. * 取得类实现的接口,由于接口类也属于Class,所以得到接口中的方法也是一样的方法得到哈
  86. */
  87. public void getInterfaceInfo(Class<?> c) {
  88. Class<?> interfaces[] = c.getInterfaces();
  89. System.out.println("\n接口");
  90. if (interfaces.length == 0) {
  91. System.out.println("无接口");
  92. return;
  93. }
  94. for (Class<?
  95.  
  96. > class1 : interfaces) {
  97. System.out.println(class1.getName());
  98. }
  99.  
  100. }
  101.  
  102. /**
  103. * 输出类的包名 传入类 , 如 传入 User.class
  104. */
  105. public void getPackageName(Class<?> c) {
  106. System.out.println("\n包名");
  107. System.out.println(c.getPackage());
  108. }
  109.  
  110. /**
  111. * 输出类的完整类名 传入类, 如 传入 User.class
  112. */
  113. public void getName(Class<?> c) {
  114. System.out.println("\n完整类名");
  115. System.out.println(c.getName());
  116. }
  117.  
  118. /**
  119. * 输出对象的类的包名 传入对象
  120. */
  121. public void getPackageName(Object object) {
  122. System.out.println("\n包名");
  123. System.out.println(object.getClass().getPackage());
  124. }
  125.  
  126. /**
  127. * 输出对象的类的完整类名 传入对象
  128. */
  129. public void getName(Object object) {
  130. System.out.println("\n完整类名");
  131. System.out.println(object.getClass().getName());
  132. }
  133.  
  134. /**
  135. * 得到一个类的类型 传入完整类名,如 "cn.lee.demo.Person"
  136. *
  137. * @throws ClassNotFoundException
  138. */
  139. public Class<?> getClass(String className) throws ClassNotFoundException {
  140. Class<?
  141.  
  142. > c = Class.forName(className);
  143. return c;
  144. }
  145.  
  146. /**
  147. * 输出构造函数
  148. */
  149. public void getConstructInfo(
  150. @SuppressWarnings("rawtypes") Constructor[] cons) {
  151. System.out.println("\n构造函数");
  152. if (cons.length == 0) {
  153. System.out.println("无构造函数");
  154. return;
  155. }
  156. for (Constructor<?> con : cons) {
  157. // 打印修饰符
  158. int mo = con.getModifiers();
  159. System.out.print(Modifier.toString(mo));
  160. // 打印构造函数名
  161. System.out.print(" " + con.getName());
  162. // 输出參数;
  163. getParmsInfo(con.getParameterTypes());
  164. System.out.println();
  165. }
  166. }
  167.  
  168. /**
  169. * 输出全部域 (成员) 传入 Field[] fields = class1.getDeclaredFields();
  170. */
  171. public void getFildInfo(Field[] fields) {
  172. System.out.println("\n域(成员)");
  173. if (fields.length == 0) {
  174. System.out.println("无域(成员)");
  175. return;
  176. }
  177. for (Field field : fields) {
  178. int m = field.getModifiers();
  179. System.out.print(Modifier.toString(m) + " ");
  180. System.out.print(field.getType() + " ");
  181. System.out.println(field.getName());
  182. }
  183. }
  184.  
  185. /**
  186. * 输出全部方法 传入Method[] methods = class1.getDeclaredMethods();
  187. */
  188. public void getMethodsInfo(Method[] method) {
  189. System.out.println("\n方法");
  190. if (method.length == 0) {
  191. System.out.println("无方法");
  192. return;
  193. }
  194. for (Method mt : method) {
  195. int m = mt.getModifiers();
  196. // 修饰符
  197. System.out.print(Modifier.toString(m) + " ");
  198. // 输出返回类型
  199. System.out.print(mt.getReturnType());
  200. System.out.print(" " + mt.getName());
  201. getParmsInfo(mt.getParameterTypes());
  202.  
  203. }
  204. }
  205.  
  206. /**
  207. * 输出方法里的參数的信息
  208. */
  209. public void getParmsInfo(@SuppressWarnings("rawtypes") Class[] parm) {
  210. System.out.print(" (");
  211.  
  212. for (Class<?> c : parm) {
  213. System.out.print(c.getName() + " ");
  214. }
  215. System.out.print(")");
  216. System.out.println();
  217. }
  218.  
  219. /**
  220. * 输出内部类
  221. */
  222. public void getInerclassInfo(
  223. @SuppressWarnings("rawtypes") Class[] innerClass) {
  224. System.out.println("\n内部类");
  225. if (innerClass.length == 0) {
  226. System.out.println("无内部类");
  227. return;
  228. }
  229. for (@SuppressWarnings("rawtypes")
  230. Class c : innerClass) {
  231. System.out.println(c.getName() + "{");
  232. getMethodsInfo(c.getDeclaredMethods());
  233. System.out.println("}");
  234. }
  235. }
  236.  
  237. /**
  238. * 输出类载入器的信息 * 在java中有三种类类载入器。[这段资料网上截取]
  239. *
  240. * 1)Bootstrap ClassLoader 此载入器採用c++编写。一般开发中非常少见。
  241.  
  242. *
  243. * 2)Extension ClassLoader 用来进行扩展类的载入。一般相应的是jre\lib\ext文件夹中的类
  244. *
  245. * 3)AppClassLoader 载入classpath指定的类。是最经常使用的载入器。同一时候也是java中默认的载入器。
  246.  
  247. *
  248. */
  249. public void getClassLoaderInfo(Class<?
  250.  
  251. > c) {
  252. System.out.println("\n类载入器");
  253. System.out.println(c.getClassLoader().getClass().getName());
  254. }
  255.  
  256. }

在android中运行

  1. ReflectUtils.getInstance().setClass("android.util.Log").listAllInfo();

得到的打印结果:

  1. 08-18 22:14:56.890: I/System.out(1208): 父类
  2. 08-18 22:14:56.930: I/System.out(1208): class java.lang.Object
  3. 08-18 22:14:56.930: I/System.out(1208): 接口
  4. 08-18 22:14:56.930: I/System.out(1208): 无接口
  5. 08-18 22:14:56.930: I/System.out(1208): 构造函数
  6. 08-18 22:14:56.930: I/System.out(1208): private android.util.Log ()
  7. 08-18 22:14:56.930: I/System.out(1208): 域(成员)
  8. 08-18 22:14:56.930: I/System.out(1208): public static final int ASSERT
  9. 08-18 22:14:56.930: I/System.out(1208): public static final int DEBUG
  10. 08-18 22:14:56.940: I/System.out(1208): public static final int ERROR
  11. 08-18 22:14:56.940: I/System.out(1208): public static final int INFO
  12. 08-18 22:14:56.940: I/System.out(1208): public static final int LOG_ID_EVENTS
  13. 08-18 22:14:56.940: I/System.out(1208): public static final int LOG_ID_MAIN
  14. 08-18 22:14:56.940: I/System.out(1208): public static final int LOG_ID_RADIO
  15. 08-18 22:14:56.940: I/System.out(1208): public static final int LOG_ID_SYSTEM
  16. 08-18 22:14:56.940: I/System.out(1208): public static final int VERBOSE
  17. 08-18 22:14:56.940: I/System.out(1208): public static final int WARN
  18. 08-18 22:14:56.950: I/System.out(1208): private static interface android.util.Log$TerribleFailureHandler sWtfHandler
  19. 08-18 22:14:56.950: I/System.out(1208): 方法
  20. 08-18 22:14:56.950: I/System.out(1208): public static int d (java.lang.String java.lang.String )
  21. 08-18 22:14:56.960: I/System.out(1208): public static int d (java.lang.String java.lang.String java.lang.Throwable )
  22. 08-18 22:14:56.960: I/System.out(1208): public static int e (java.lang.String java.lang.String )
  23. 08-18 22:14:56.960: I/System.out(1208): public static int e (java.lang.String java.lang.String java.lang.Throwable )
  24. 08-18 22:14:56.960: I/System.out(1208): public static class java.lang.String getStackTraceString (java.lang.Throwable )
  25. 08-18 22:14:56.960: I/System.out(1208): public static int i (java.lang.String java.lang.String )
  26. 08-18 22:14:56.960: I/System.out(1208): public static int i (java.lang.String java.lang.String java.lang.Throwable )
  27. 08-18 22:14:56.960: I/System.out(1208): public static native boolean isLoggable (java.lang.String int )
  28. 08-18 22:14:56.970: I/System.out(1208): public static int println (int java.lang.String java.lang.String )
  29. 08-18 22:14:56.970: I/System.out(1208): public static native int println_native (int int java.lang.String java.lang.String )
  30. 08-18 22:14:56.970: I/System.out(1208): public static interface android.util.Log$TerribleFailureHandler setWtfHandler (android.util.Log$TerribleFailureHandler )
  31. 08-18 22:14:56.970: I/System.out(1208): public static int v (java.lang.String java.lang.String )
  32. 08-18 22:14:56.980: I/System.out(1208): public static int v (java.lang.String java.lang.String java.lang.Throwable )
  33. 08-18 22:14:56.980: I/System.out(1208): public static int w (java.lang.String java.lang.String )
  34. 08-18 22:14:56.980: I/System.out(1208): public static int w (java.lang.String java.lang.String java.lang.Throwable )
  35. 08-18 22:14:56.980: I/System.out(1208): public static int w (java.lang.String java.lang.Throwable )
  36. 08-18 22:14:56.980: I/System.out(1208): static int wtf (int java.lang.String java.lang.String java.lang.Throwable boolean )
  37. 08-18 22:14:56.980: I/System.out(1208): public static int wtf (java.lang.String java.lang.String )
  38. 08-18 22:14:56.980: I/System.out(1208): public static int wtf (java.lang.String java.lang.String java.lang.Throwable )
  39. 08-18 22:14:56.980: I/System.out(1208): public static int wtf (java.lang.String java.lang.Throwable )
  40. 08-18 22:14:56.980: I/System.out(1208): public static int wtfStack (java.lang.String java.lang.String )
  41. 08-18 22:14:56.980: I/System.out(1208): 内部类
  42. 08-18 22:14:56.980: I/System.out(1208): android.util.Log$TerribleFailureHandler{
  43. 08-18 22:14:56.990: I/System.out(1208): 方法
  44. 08-18 22:14:57.000: I/System.out(1208): public abstract void onTerribleFailure (java.lang.String android.util.Log$TerribleFailure )
  45. 08-18 22:14:57.000: I/System.out(1208): }
  46. 08-18 22:14:57.000: I/System.out(1208): android.util.Log$TerribleFailure{
  47. 08-18 22:14:57.000: I/System.out(1208): 方法
  48. 08-18 22:14:57.000: I/System.out(1208): 无方法
  49. 08-18 22:14:57.000: I/System.out(1208): }
  50. 08-18 22:14:57.010: I/System.out(1208): 类载入器
  51. 08-18 22:14:57.010: I/System.out(1208): java.lang.BootClassLoader

三. Java反射操作域和方法的Demo

先写一个要被进行演示操作的类User.java

  1. package com.yjq.reflect;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import com.yjq.reflect.UserDescribtion.Sex;
  6.  
  7. public class User implements Serializable{
  8. private int id;
  9.  
  10. private String name;
  11.  
  12. private Sex sex;
  13.  
  14. public User(){
  15. super();
  16. }
  17. public User(int _id,String _name,Sex _sex){
  18. this.id=_id;
  19. this.name=_name;
  20. this.sex=_sex;
  21. }
  22. public int getId() {
  23. return id;
  24. }
  25.  
  26. public void setId(int id) {
  27. this.id = id;
  28. }
  29.  
  30. public String getName() {
  31. return name;
  32. }
  33.  
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37.  
  38. public Sex getSex() {
  39. return sex;
  40. }
  41.  
  42. public void setSex(Sex sex) {
  43. this.sex = sex;
  44. }
  45.  
  46. @Override
  47. public String toString() {
  48. return "User [id=" + id + ", name=" + name + ", sex=" + sex + "]";
  49. }
  50.  
  51. public void test(){ testMethod(1,"hello");}
  52.  
  53. private void testMethod(int i,String s){
  54. System.out.println("private method in user "+i+s);
  55. }
  56.  
  57. public enum Sex {
  58. MALE("男"), FEMALE("女");
  59.  
  60. // 枚举对象的属性
  61. private String sexDescribtion;
  62.  
  63. // 枚举对象构造函数
  64. private Sex(String sx) {
  65. this.sexDescribtion = sx;
  66. }
  67. }
  68. }

Demo:

  1. // 通过Java反射调用方法
  2. private void callMethodsDemo() throws ClassNotFoundException,
  3. NoSuchMethodException, SecurityException, IllegalAccessException,
  4. IllegalArgumentException, InvocationTargetException,
  5. InstantiationException {
  6. Class<?> class1 = null;
  7. class1 = Class.forName("com.yjq.reflect.User");
  8.  
  9. System.out.println("\nDemo: \n调用无參方法testMethod():");
  10. Method method = class1.getDeclaredMethod("testMethod", new Class[]{int.class, String.class});
  11. // .getMethod("test"); getMethod仅仅能调用public的方法
  12. method.setAccessible(true);
  13. method.invoke(class1.newInstance(),23,"hello23");
  14.  
  15. System.out.println("调用有參方法setId(int):");
  16. method = class1.getMethod("setId",int.class);
  17. User user = (User)class1.newInstance();
  18. method.invoke(user,100);
  19. System.out.println(user);
  20. }
  21.  
  22. // 通过Java反射操作域(成员)
  23. private void setFieldsDemo() throws InstantiationException,
  24. IllegalAccessException, ClassNotFoundException,
  25. NoSuchFieldException, SecurityException {
  26. Class<?> class1 = null;
  27. class1 = Class.forName("com.yjq.reflect.User");
  28. Object obj = class1.newInstance(); // 须有无參构造函数
  29.  
  30. Field userNameField = class1.getDeclaredField("name");
  31. userNameField.setAccessible(true);
  32. userNameField.set(obj, "==Myname==");
  33.  
  34. System.out.println("Demo: 通过Java反射操作域(成员): 改动属性之后得到属性变量的值:"
  35. + userNameField.get(obj));
  36. }
  37.  
  38. // 通过java反射创建对象
  39. private void getInstanceDemo() throws InstantiationException,
  40. IllegalAccessException, IllegalArgumentException,
  41. InvocationTargetException, ClassNotFoundException {
  42. User user1 = null;
  43. User user2 = null;
  44.  
  45. Class<?> class1 = Class.forName("com.yjq.reflect.User");
  46. // 得到一系列构造函数集合
  47. Constructor<?>[] constructors = class1.getConstructors();
  48.  
  49. user1 = (User) constructors[0].newInstance();
  50. user1.setId(112031);
  51. user1.setName("leeFeng");
  52.  
  53. user2 = (User) constructors[1].newInstance(12432, "Mali", Sex.FEMALE);
  54.  
  55. System.out.println("Demo:通过java反射创建对象");
  56. System.out.println(user1);
  57. System.out.println(user2);
  58. }

四. Java反射在android中的应用

摘自:http://mysuperbaby.iteye.com/blog/1458966

在Android中。能够从以下两点考虑来使用Java反射(Java Reflection)机制,从而达到意想不到的效果。

这里也将展示Google是如何在自己的应用中来使用Java反射机制的。

1. 同一时候兼容新老版本号的SDK

Android往往会在新版本号中引入一些新的API来替代老的API,这些新的API在性能或者易用性上比老的API更好。但为了兼容性。新老API往往是共存的。

在这样的情况下,你的应用假设调用了新的API,是没办法在安装老版本号Android的设备上执行的,但假设使用老的API,又没办法在安装新版本号Android的设备上体现新API的性能。

这时候,就能够使用Java反射机制,从而实现一个apk,假设安装在老版本号Android的设备上。则调用老的API。安装在新版本号Android的设备上,则调用新的API。

以下是来自Google的一段代码:

  1. public class SharedPreferencesCompat {
  2. private static final Method sApplyMethod = findApplyMethod();
  3. private static Method findApplyMethod() {
  4. try {
  5. return SharedPreferences.Editor.class.getMethod("apply", new Class[0]);
  6. } catch (NoSuchMethodException e) {
  7. return null;
  8. }
  9. }
  10. public static void apply(SharedPreferences.Editor editor) {
  11. if (sApplyMethod != null) {
  12. try {
  13. sApplyMethod.invoke(editor, new Object[0]);
  14. return;
  15. } catch (IllegalAccessException e) {
  16. } catch (InvocationTargetException e) {
  17. }
  18. }
  19. editor.commit();
  20. }
  21. }

2. 使用私有的API

假设在Eclipse上开发应用,必须调用相应的Android SDK的标准API,即在开发文档中说明的API。调用非标准的即私有的API,是编译只是的。

但Android实际上有非常多API,是被@hide标注的。

被@hide注解的类和方法就是私有API。

假设一个应用想调用这些API,则仅仅有在编译整个系统image的时候才干编译过,而在Eclipse上是编译只是的。

所以。这些API往往会被手机开发商的本地应用调用。则第三方的应用是没办法调用的。

这种情况下,能够使用Java反射机制来调用这些私有的API。一旦编译通过生成了apk,就能正常在手机上执行,由于这种API的实现已经在手机系统中仅仅是没有公开出来。

以下是来自Google的一段代码:

  1. private static final String AMR_INPUT_STREAM_CLASS = "android.media.AmrInputStream";
  2. private static Class<?

    > getAmrInputStreamClass() throws ClassNotFoundException {

  3. return Class.forName(AMR_INPUT_STREAM_CLASS);
  4. }
  5. private static InputStream createAmrInputStream(InputStream in) {
  6. try {
  7. Class<?> clazz = getAmrInputStreamClass();
  8. Constructor<?> constructor = clazz.getConstructor(new Class[] { InputStream.class });
  9. return (InputStream)constructor.newInstance(new Object[] { in });
  10. }
  11. ...
  12. }

3.补充:将SharedPreferences数据文件存储到sd卡上?

  1. SharedPreference原则上仅仅能保存在当前应用程序私有的shared_prefs文件夹中。只是能够利用反射技术改变系统内定的文件保存路径。
  2. try {
  3. Field field = ContextWrapper.class.getDeclaredField("mBase");
  4. field.setAccessible(true);
  5. Object obj = field.get(this);
  6. field = obj.getClass().getDeclaredField("mPreferencesDir");
  7. field.setAccessible(true);
  8. File file = new File("/sdcard/");
  9. field.set(obj, file);
  10. SharedPreferences mySharedPreferences = getSharedPreferences("config", Activity.MODE_PRIVATE);
  11. SharedPreferences.Editor editor = mySharedPreferences.edit();
  12. editor.putString("name", "nancy");
  13. editor.commit();
  14. } catch (Exception e) { }

Java反射及其在Android中的应用学习总结的更多相关文章

  1. Java 反射在实际开发中的应用

    运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...

  2. java反射查看jar包中所有的类名方法名

    不反编译,不用其他工具,用java反射查看jar包中所有的类名方法名,网上很多都报错,下面这个你试试看:话不多说直接撸代码: import java.lang.reflect.Field; impor ...

  3. [转]Java 反射在实际开发中的应用

    一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2  :RTT ...

  4. Java时间间隔问题在Android中的使用

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6606720.html 假设我们在做项目的时候,获取到了一段音频,也知道音频长度,那么我们想对音频做一些处理 ...

  5. Java:类集框架中集合的学习

    Java:类集框架中集合的学习 集合 Java:Set的学习 Set是类集框架中的集合类.集合是不按特定的方式排序,并且没有重复对象的一种类. Q:Set如何操作?Set中的不按特定方式排序是怎么排序 ...

  6. 反射技术在Android中的应用

    本博客转自:http://blog.csdn.net/tiefeng0606/article/details/51700866 动态语言: 一般认为在程序运行时,允许改变程序结构或变量类型,这种语言称 ...

  7. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  8. Java乔晓松-android中获取图片的缩略图(解决OutOfMemoryError)内存溢出的Bug

    由于android获取图片过大是会出现内存溢出的Bug 07-02 05:10:13.792: E/AndroidRuntime(6016): java.lang.OutOfMemoryError 解 ...

  9. Java乔晓松-android中上传图片到服务器Tomcat(Struts2)

    在做android开发的时候,有时你会用到图片的上传功能,在我的android项目中,我是选中图片,点击上传多张图片 android客户端上传图片部分的代码如下: package com.exampl ...

随机推荐

  1. [error:没有解析库]Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?

    将代码拷贝到服务器上运行,发生错误提示需要新安装parser library. 查看代码中发现有以下内容: soup = BeautifulSoup(open(fp), 'xml') 安装解析库即可: ...

  2. Hadoop全分布式模式安装

    一.准备 1.准备至少三台linux服务器,并安装JDK 关闭防火墙如下 systemctl stop firewalld.service systemctl disable firewalld.se ...

  3. Model View Controller(MVC) in PHP

    The model view controller pattern is the most used pattern for today’s world web applications. It ha ...

  4. DS博客作业——树

    DS博客作业--树 1.本周学习总结 1.思维导图 2.谈谈你对树结构的认识及学习体会. 在树这一章节,我们学习的是二叉树的算法. 树的构建:一种是直接给树的顺序存储结构的字符串,一种是通过先序遍历和 ...

  5. [JLOI2011]飞行路线 (分层图,最短路)

    题目链接 Solution 建立 \(k+1\) 层图跑 \(Dijkstra\) 就好了. Code #include<bits/stdc++.h> #define ll long lo ...

  6. javaweb学习总结(十)——HttpServletRequest对象(一)(转)

    (每天都会更新至少一篇以上,有兴趣的可以关注)转载自孤傲苍狼 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器 ...

  7. 一个老忘且非常有用的jquery动画方法 网页上卷

    $('html,body').animate({scrollTop:800+'px'},500) //网页上卷800像素 在半秒之内

  8. PHP读取APK的包信息,包括包名,应用名,权限,LOGO等

    [转]PHP读取APK的包信息,包括包名,应用名,权限,LOGO等 声明本文转自: 原文链接:https://www.jb51.net/article/53780.htm: 感谢分享! <?ph ...

  9. Group by 两表联查取另一表与之关联数据的总数

    使用group by 需要查询的字段 必须要放在group by 后面 SELECT U.UserLotterySn,count(W.Userlotterysn) as WinCount,U.Acti ...

  10. AC日记——花店橱窗布置 codevs 1028

    题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的 ...